General Setup

Setup chunk

Setup reticulate

knitr::opts_chunk$set(fig.width = 8)
knitr::opts_knit$set(root.dir = normalizePath(".."))
knitr::opts_knit$get("root.dir")
[1] "/nas/groups/treutlein/USERS/tomasgomes/projects/liver_regen"

Load libraries

library(reticulate)
knitr::knit_engines$set(python = reticulate::eng_python)
py_available(initialize = FALSE)
[1] TRUE
use_python(Sys.which("python"))
py_config()
python:         /home/tpires/bin/miniconda3/bin/python
libpython:      /home/tpires/bin/miniconda3/lib/libpython3.8.so
pythonhome:     /home/tpires/bin/miniconda3:/home/tpires/bin/miniconda3
version:        3.8.3 (default, May 19 2020, 18:47:26)  [GCC 7.3.0]
numpy:          /home/tpires/bin/miniconda3/lib/python3.8/site-packages/numpy
numpy_version:  1.19.0

NOTE: Python version was forced by RETICULATE_PYTHON

Functions

getDPT = function(x){
  return(destiny:::dpt_for_branch(destiny::branch_divide(x, integer(0L)), 
                                  min(destiny::branch_divide(x, integer(0L))@branch[, 1], 
                                      na.rm = TRUE)))
}
CVgam = function (formula, data, nfold = 10, debug.level = 0, method = "glm.fit", 
    printit = TRUE, cvparts = NULL, seed = 29){
  # modified from the `gamclass` package to use gam::gam
    if (is.null(cvparts)) {
        set.seed(seed)
        cvparts <- sample(1:nfold, nrow(data), replace = TRUE)
    }
    folds <- unique(cvparts)
    khat <- hat <- numeric(nrow(data))
    scale.gam <- summary(gam::gam(formula, data = data, method = method,
                                  family = mgcv::betar(link = "logit", eps = 0.00001)))$scale
    for (i in folds) {
        trainrows <- cvparts != i
        testrows <- cvparts == i
        elev.gam <- gam::gam(formula, data = data[trainrows, ], 
                             method = method, 
                             family = mgcv::betar(link = "logit", eps = 0.00001))
        hat[testrows] <- predict(elev.gam, newdata = data[testrows,], select = T, type = "response")
        res <- residuals(elev.gam)
    }
    y <- eval(formula[[2]], envir = as.data.frame(data))
    res <- y - hat
    cvscale <- sum(res^2)/length(res)
    prntvec <- c(GAMscale = scale.gam, `CV-mse-GAM ` = cvscale)
    if (printit) 
        print(round(prntvec, 4))
    invisible(list(fitted = hat, resid = res, cvscale = cvscale, 
        scale.gam = scale.gam))
}
fittingFunc = function(g){
  t = sub_dat$zonation_pt
  gene_fit_p = c()
  gene_fit_vals = data.frame(row.names = 1:100)
  z = sub_dat@assays$SCT@data[g,]
    
  d = data.frame(z=z, t=t)
  tmp = suppressMessages(gam(z ~ ns(t, df = 3), data=d))
  
  # bins for model fitting
  bb = seq(min(t), max(t), length.out = 100)
  gene_fit_vals[,g] = suppressMessages(predict(tmp,
                                               newdata = data.frame(t = bb)))
  p = summary(tmp)$parametric.anova$`Pr(>F)`[1]
  gene_fit_p = c(gene_fit_p, p)
  names(gene_fit_p)[length(gene_fit_p)] = g
  
  return(list("fits" = gene_fit_vals, "pval" = gene_fit_p))
}
minmax_scale = function(x){
  return((x-min(x))/(max(x)-min(x)))
}
getTopTerms = function(godf, topt = 100, ncl = 5, nt = 2){
  topt = if(nrow(godf)<topt) nrow(godf) else topt
  if(nrow(godf)<ncl) return(godf)
  df = godf[1:topt,]
  genes = sapply(df$geneID, function(x) strsplit(x, "/"))
  resmat = matrix(0, length(genes), length(genes))
  for(i in 1:length(genes)){
    for(j in 1:length(genes)){
      resmat[i,j] = length(intersect(genes[[i]], genes[[j]]))/length(genes[[i]])
    }
  }
  cl = hclust(dist(resmat), method = "ward.D2")
  cl = cutree(cl, ncl)
  res_df = data.frame("Description" = df$Description, "qvalue" = df$qvalue, "geneID" = df$geneID, 
                      cl, stringsAsFactors = F)
  res_df = res_df[order(res_df$qvalue, decreasing = F),]
  topterms = unlist(tapply(res_df$Description, res_df$cl, function(x) x[1:nt]))
  res_df = res_df[res_df$Description %in% topterms,]
  
  return(res_df)
}

Load data (from all cells)

getDPT = function(x){
  return(destiny:::dpt_for_branch(destiny::branch_divide(x, integer(0L)), 
                                  min(destiny::branch_divide(x, integer(0L))@branch[, 1], 
                                      na.rm = TRUE)))
}
CVgam = function (formula, data, nfold = 10, debug.level = 0, method = "glm.fit", 
    printit = TRUE, cvparts = NULL, seed = 29){
  # modified from the `gamclass` package to use gam::gam
    if (is.null(cvparts)) {
        set.seed(seed)
        cvparts <- sample(1:nfold, nrow(data), replace = TRUE)
    }
    folds <- unique(cvparts)
    khat <- hat <- numeric(nrow(data))
    scale.gam <- summary(gam::gam(formula, data = data, method = method,
                                  family = mgcv::betar(link = "logit", eps = 0.00001)))$scale
    for (i in folds) {
        trainrows <- cvparts != i
        testrows <- cvparts == i
        elev.gam <- gam::gam(formula, data = data[trainrows, ], 
                             method = method, 
                             family = mgcv::betar(link = "logit", eps = 0.00001))
        hat[testrows] <- predict(elev.gam, newdata = data[testrows,], select = T, type = "response")
        res <- residuals(elev.gam)
    }
    y <- eval(formula[[2]], envir = as.data.frame(data))
    res <- y - hat
    cvscale <- sum(res^2)/length(res)
    prntvec <- c(GAMscale = scale.gam, `CV-mse-GAM ` = cvscale)
    if (printit) 
        print(round(prntvec, 4))
    invisible(list(fitted = hat, resid = res, cvscale = cvscale, 
        scale.gam = scale.gam))
}
fittingFunc = function(g){
  t = sub_dat$zonation_pt
  gene_fit_p = c()
  gene_fit_vals = data.frame(row.names = 1:100)
  z = sub_dat@assays$SCT@data[g,]
    
  d = data.frame(z=z, t=t)
  tmp = suppressMessages(gam(z ~ ns(t, df = 3), data=d))
  
  # bins for model fitting
  bb = seq(min(t), max(t), length.out = 100)
  gene_fit_vals[,g] = suppressMessages(predict(tmp,
                                               newdata = data.frame(t = bb)))
  p = summary(tmp)$parametric.anova$`Pr(>F)`[1]
  gene_fit_p = c(gene_fit_p, p)
  names(gene_fit_p)[length(gene_fit_p)] = g
  
  return(list("fits" = gene_fit_vals, "pval" = gene_fit_p))
}
minmax_scale = function(x){
  return((x-min(x))/(max(x)-min(x)))
}
getTopTerms = function(godf, topt = 100, ncl = 5, nt = 2){
  topt = if(nrow(godf)<topt) nrow(godf) else topt
  if(nrow(godf)<ncl) return(godf)
  df = godf[1:topt,]
  genes = sapply(df$geneID, function(x) strsplit(x, "/"))
  resmat = matrix(0, length(genes), length(genes))
  for(i in 1:length(genes)){
    for(j in 1:length(genes)){
      resmat[i,j] = length(intersect(genes[[i]], genes[[j]]))/length(genes[[i]])
    }
  }
  cl = hclust(dist(resmat), method = "ward.D2")
  cl = cutree(cl, ncl)
  res_df = data.frame("Description" = df$Description, "qvalue" = df$qvalue, "geneID" = df$geneID, 
                      cl, stringsAsFactors = F)
  res_df = res_df[order(res_df$qvalue, decreasing = F),]
  topterms = unlist(tapply(res_df$Description, res_df$cl, function(x) x[1:nt]))
  res_df = res_df[res_df$Description %in% topterms,]
  
  return(res_df)
}

Endothelial cell clustering

Subset LSEC

allcells_css = readRDS(file = "data/processed/allcells_css.RDS")

Cluster and get markers

all_end_cells = allcells_css[,grepl("LSEC", allcells_css@meta.data$allcells_clusters)]
all_end_cells = suppressWarnings(SCTransform(all_end_cells, do.correct.umi = T, verbose = F, 
                                             vars.to.regress=c("unique_name","nCount_RNA"),
                                             variable.features.rv.th = 1, seed.use = 1,
                                             return.only.var.genes = F, 
                                             variable.features.n = NULL))
all_end_cells = RunPCA(all_end_cells, verbose = F)
all_end_cells = RunUMAP(all_end_cells, dims = 1:25, verbose = F)
DimPlot(all_end_cells, reduction = "umap", group.by = "Condition")

DimPlot(all_end_cells, reduction = "umap", group.by = "allcells_simp")

DimPlot(all_end_cells, reduction = "umap", group.by = "Donor")

DimPlot(all_end_cells, reduction = "umap", group.by = "Phase")

FeaturePlot(all_end_cells, reduction = "umap", features = c("MKI67", "ALB", "S100A8", "COLEC11",
                                                            "CLEC1B", "CLEC14A", "AQP1", "MGP", 
                                                            "LYVE1", "PROX1", "CD14", "PECAM1",
                                                            "VWF", "INMT", "PLVAP", "RBP7"))

Annotate the clusters

all_end_cells = FindNeighbors(all_end_cells, reduction = "pca", dims = 1:25,
                              prune.SNN = 1/5, force.recalc = T, graph.name = "pca25")
Computing nearest neighbor graph
Computing SNN
all_end_cells = FindClusters(all_end_cells, algorithm = 2, verbose = F, graph.name = "pca25",
                             resolution = seq(0.1, 2, 0.1))
DimPlot(all_end_cells, reduction = "umap", group.by = "pca25_res.1", label = T)
Using `as.character()` on a quosure is deprecated as of rlang 0.3.0.
Please use `as_label()` or `as_name()` instead.
This warning is displayed once per session.

DimPlot(all_end_cells, reduction = "umap", group.by = "Donor", label = F)

DimPlot(all_end_cells, reduction = "umap", group.by = "Condition", label = F)


all_end_cells = SetIdent(all_end_cells, value = "pca25_res.1")

Redo all w/o contaminating cells (only ECs of any type)

Markers for filtered clusters

DimPlot(only_end_cells, reduction = "umap", group.by = "pca25_res.0.9", label = T)
DimPlot(only_end_cells, reduction = "umap", group.by = "endo_simp", label = T)

DimPlot(only_end_cells, reduction = "umap", group.by = "Donor", label = F)

DimPlot(only_end_cells, reduction = "umap", group.by = "Condition", label = F)

Annotate the clusters for ECs only

annot = c("0" = "Midzonal LSEC",
"1" = "Pericentral LSEC",
"2" = "LSEC (stress)",
"3" = "Periportal LSEC",
"4" = "EC non-LSEC",
"5" = "LSEC (interferon)",
"6" = "LSEC (remodelling)",
"7" = "LSEC (high MT 1)",
"8" = "LSEC (high MT 2)",
"9" = "LSEC (fenestr.)",
"10" = "Lymphatic EC",
"11" = "Cycling cells",
"12" = "Periportal LSEC")

clnames = data.frame("endoOnly_annot" = only_end_cells@meta.data$pca25_res.0.9)
rownames(clnames) = colnames(only_end_cells)
clnames$endo_spec = plyr::revalue(clnames$endoOnly_annot, annot)
clnames$endo_simp = as.character(clnames$endo_spec)

only_end_cells = AddMetaData(only_end_cells, metadata = clnames)
DimPlot(only_end_cells, reduction = "umap", group.by = "endo_simp", label = F)

saveRDS(only_end_cells, file = "./results/endothelial/only_end_cells.RDS")

Get condition markers for each cluster

Plot abundance of clusters per condition

df_cnt = table(only_end_cells$endo_simp, only_end_cells$Condition)
df_cnt_perCond = reshape2::melt(apply(df_cnt, 2, function(x) round(x/sum(x)*100, 1)))
df_cnt_perCl = reshape2::melt(apply(df_cnt, 1, function(x) round(x/sum(x)*100, 1)))

mat_cnt_all = reshape2::dcast(data = df_cnt_perCond, formula = Var1 ~ Var2, value.var = "value")
rownames(mat_cnt_all) = mat_cnt_all$Var1
mat_cnt_all = mat_cnt_all[,-1]
ctord = hclust(dist(mat_cnt_all[,c(2,1,3)]))$order

heatp = pheatmap::pheatmap(mat_cnt_all[ctord,c(2,1,3)], cluster_cols = F, cluster_rows = F, 
                           treeheight_row = F, display_numbers = T, 
                           number_color = c("black","white")[as.integer(mat_cnt_all[ctord,c(2,1,3)]>25)+1],
                           color = colorRampPalette(brewer.pal(n = 9, name = "Blues"))(100),
                           fontsize_row = 8, fontsize_col = 8, angle_col = 0)

mat_cnt_all = reshape2::dcast(data = df_cnt_perCl, formula = Var1 ~ Var2, value.var = "value")
rownames(mat_cnt_all) = mat_cnt_all$Var1
mat_cnt_all = t(mat_cnt_all[,-1])
ctord = hclust(dist(mat_cnt_all[,c(2,1,3)]))$order

heatp = pheatmap::pheatmap(mat_cnt_all[ctord,c(2,1,3)], cluster_cols = F, cluster_rows = F, 
                           treeheight_row = F, display_numbers = T, 
                           number_color = c("black", "white")[as.integer(mat_cnt_all[ctord,c(2,1,3)]>50)+1],
                           color = colorRampPalette(brewer.pal(n = 9, name = "Blues"))(100),
                           fontsize_row = 8, fontsize_col = 8, angle_col = 0)

only_end_cells = SetIdent(only_end_cells, value = "endo_simp")
mkend_simp = FindAllMarkers(only_end_cells, logfc.threshold = 0.2, pseudocount.use = 0.1)
write.csv(mkend_simp[mkend_simp$p_val_adj<=0.05,], 
          file = "results/endothelial/markers_endo_subpop_simp.csv", row.names = T, quote = F)

Endothelial zonation

Make different subsets to test

df_cnt = table(only_end_cells$endo_simp, only_end_cells$Condition)
df_cnt_perCond = reshape2::melt(apply(df_cnt, 2, function(x) round(x/sum(x)*100, 1)))
df_cnt_perCl = reshape2::melt(apply(df_cnt, 1, function(x) round(x/sum(x)*100, 1)))

mat_cnt_all = reshape2::dcast(data = df_cnt_perCond, formula = Var1 ~ Var2, value.var = "value")
rownames(mat_cnt_all) = mat_cnt_all$Var1
mat_cnt_all = mat_cnt_all[,-1]
ctord = hclust(dist(mat_cnt_all[,c(2,1,3)]))$order

heatp = pheatmap::pheatmap(mat_cnt_all[ctord,c(2,1,3)], cluster_cols = F, cluster_rows = F, 
                           treeheight_row = F, display_numbers = T, 
                           number_color = c("black","white")[as.integer(mat_cnt_all[ctord,c(2,1,3)]>25)+1],
                           color = colorRampPalette(brewer.pal(n = 9, name = "Blues"))(100),
                           fontsize_row = 8, fontsize_col = 8, angle_col = 0)


mat_cnt_all = reshape2::dcast(data = df_cnt_perCl, formula = Var1 ~ Var2, value.var = "value")
rownames(mat_cnt_all) = mat_cnt_all$Var1
mat_cnt_all = t(mat_cnt_all[,-1])
ctord = hclust(dist(mat_cnt_all[,c(2,1,3)]))$order

heatp = pheatmap::pheatmap(mat_cnt_all[ctord,c(2,1,3)], cluster_cols = F, cluster_rows = F, 
                           treeheight_row = F, display_numbers = T, 
                           number_color = c("black", "white")[as.integer(mat_cnt_all[ctord,c(2,1,3)]>50)+1],
                           color = colorRampPalette(brewer.pal(n = 9, name = "Blues"))(100),
                           fontsize_row = 8, fontsize_col = 8, angle_col = 0)


only_end_cells = SetIdent(only_end_cells, value = "endo_simp")
mkend_simp = FindAllMarkers(only_end_cells, logfc.threshold = 0.2, pseudocount.use = 0.1)
Calculating cluster LSEC (stress)

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~27s          
  |++                                                | 2 % ~28s          
  |++                                                | 3 % ~28s          
  |+++                                               | 4 % ~27s          
  |+++                                               | 5 % ~27s          
  |++++                                              | 7 % ~27s          
  |++++                                              | 8 % ~27s          
  |+++++                                             | 9 % ~27s          
  |+++++                                             | 10% ~26s          
  |++++++                                            | 11% ~26s          
  |++++++                                            | 12% ~26s          
  |+++++++                                           | 13% ~25s          
  |++++++++                                          | 14% ~25s          
  |++++++++                                          | 15% ~25s          
  |+++++++++                                         | 16% ~24s          
  |+++++++++                                         | 17% ~24s          
  |++++++++++                                        | 18% ~24s          
  |++++++++++                                        | 20% ~23s          
  |+++++++++++                                       | 21% ~23s          
  |+++++++++++                                       | 22% ~23s          
  |++++++++++++                                      | 23% ~22s          
  |++++++++++++                                      | 24% ~22s          
  |+++++++++++++                                     | 25% ~22s          
  |++++++++++++++                                    | 26% ~21s          
  |++++++++++++++                                    | 27% ~21s          
  |+++++++++++++++                                   | 28% ~21s          
  |+++++++++++++++                                   | 29% ~21s          
  |++++++++++++++++                                  | 30% ~20s          
  |++++++++++++++++                                  | 32% ~20s          
  |+++++++++++++++++                                 | 33% ~20s          
  |+++++++++++++++++                                 | 34% ~19s          
  |++++++++++++++++++                                | 35% ~19s          
  |++++++++++++++++++                                | 36% ~19s          
  |+++++++++++++++++++                               | 37% ~18s          
  |++++++++++++++++++++                              | 38% ~18s          
  |++++++++++++++++++++                              | 39% ~18s          
  |+++++++++++++++++++++                             | 40% ~17s          
  |+++++++++++++++++++++                             | 41% ~17s          
  |++++++++++++++++++++++                            | 42% ~17s          
  |++++++++++++++++++++++                            | 43% ~16s          
  |+++++++++++++++++++++++                           | 45% ~16s          
  |+++++++++++++++++++++++                           | 46% ~16s          
  |++++++++++++++++++++++++                          | 47% ~15s          
  |++++++++++++++++++++++++                          | 48% ~15s          
  |+++++++++++++++++++++++++                         | 49% ~15s          
  |+++++++++++++++++++++++++                         | 50% ~15s          
  |++++++++++++++++++++++++++                        | 51% ~14s          
  |+++++++++++++++++++++++++++                       | 52% ~14s          
  |+++++++++++++++++++++++++++                       | 53% ~14s          
  |++++++++++++++++++++++++++++                      | 54% ~13s          
  |++++++++++++++++++++++++++++                      | 55% ~13s          
  |+++++++++++++++++++++++++++++                     | 57% ~13s          
  |+++++++++++++++++++++++++++++                     | 58% ~12s          
  |++++++++++++++++++++++++++++++                    | 59% ~12s          
  |++++++++++++++++++++++++++++++                    | 60% ~12s          
  |+++++++++++++++++++++++++++++++                   | 61% ~11s          
  |+++++++++++++++++++++++++++++++                   | 62% ~11s          
  |++++++++++++++++++++++++++++++++                  | 63% ~11s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~10s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~10s          
  |++++++++++++++++++++++++++++++++++                | 66% ~10s          
  |++++++++++++++++++++++++++++++++++                | 67% ~09s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~09s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~09s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~09s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~08s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~08s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~08s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~07s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~07s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~07s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~06s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=29s  
Calculating cluster EC non-LSEC

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 14s      
  |++                                                | 2 % ~01m 15s      
  |++                                                | 3 % ~01m 14s      
  |+++                                               | 4 % ~01m 13s      
  |+++                                               | 5 % ~01m 13s      
  |++++                                              | 6 % ~01m 12s      
  |++++                                              | 7 % ~01m 11s      
  |+++++                                             | 8 % ~01m 10s      
  |+++++                                             | 9 % ~01m 09s      
  |++++++                                            | 10% ~01m 08s      
  |++++++                                            | 11% ~01m 07s      
  |+++++++                                           | 12% ~01m 07s      
  |+++++++                                           | 13% ~01m 06s      
  |++++++++                                          | 14% ~01m 05s      
  |++++++++                                          | 15% ~01m 04s      
  |+++++++++                                         | 16% ~01m 04s      
  |+++++++++                                         | 17% ~01m 03s      
  |++++++++++                                        | 18% ~01m 02s      
  |++++++++++                                        | 19% ~01m 01s      
  |+++++++++++                                       | 20% ~01m 01s      
  |+++++++++++                                       | 21% ~60s          
  |++++++++++++                                      | 22% ~59s          
  |++++++++++++                                      | 23% ~58s          
  |+++++++++++++                                     | 24% ~58s          
  |+++++++++++++                                     | 26% ~57s          
  |++++++++++++++                                    | 27% ~56s          
  |++++++++++++++                                    | 28% ~55s          
  |+++++++++++++++                                   | 29% ~54s          
  |+++++++++++++++                                   | 30% ~54s          
  |++++++++++++++++                                  | 31% ~53s          
  |++++++++++++++++                                  | 32% ~52s          
  |+++++++++++++++++                                 | 33% ~51s          
  |+++++++++++++++++                                 | 34% ~51s          
  |++++++++++++++++++                                | 35% ~50s          
  |++++++++++++++++++                                | 36% ~49s          
  |+++++++++++++++++++                               | 37% ~48s          
  |+++++++++++++++++++                               | 38% ~47s          
  |++++++++++++++++++++                              | 39% ~47s          
  |++++++++++++++++++++                              | 40% ~46s          
  |+++++++++++++++++++++                             | 41% ~45s          
  |+++++++++++++++++++++                             | 42% ~44s          
  |++++++++++++++++++++++                            | 43% ~44s          
  |++++++++++++++++++++++                            | 44% ~43s          
  |+++++++++++++++++++++++                           | 45% ~42s          
  |+++++++++++++++++++++++                           | 46% ~41s          
  |++++++++++++++++++++++++                          | 47% ~41s          
  |++++++++++++++++++++++++                          | 48% ~40s          
  |+++++++++++++++++++++++++                         | 49% ~39s          
  |+++++++++++++++++++++++++                         | 50% ~38s          
  |++++++++++++++++++++++++++                        | 51% ~37s          
  |+++++++++++++++++++++++++++                       | 52% ~37s          
  |+++++++++++++++++++++++++++                       | 53% ~36s          
  |++++++++++++++++++++++++++++                      | 54% ~35s          
  |++++++++++++++++++++++++++++                      | 55% ~34s          
  |+++++++++++++++++++++++++++++                     | 56% ~34s          
  |+++++++++++++++++++++++++++++                     | 57% ~33s          
  |++++++++++++++++++++++++++++++                    | 58% ~32s          
  |++++++++++++++++++++++++++++++                    | 59% ~31s          
  |+++++++++++++++++++++++++++++++                   | 60% ~30s          
  |+++++++++++++++++++++++++++++++                   | 61% ~30s          
  |++++++++++++++++++++++++++++++++                  | 62% ~29s          
  |++++++++++++++++++++++++++++++++                  | 63% ~28s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~27s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~27s          
  |++++++++++++++++++++++++++++++++++                | 66% ~26s          
  |++++++++++++++++++++++++++++++++++                | 67% ~25s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~24s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~23s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~23s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~22s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~21s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~20s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~20s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~19s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~18s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~17s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~16s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~16s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~15s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~14s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~13s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~13s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~12s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~11s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01m 16s
Calculating cluster LSEC (remodelling)

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~33s          
  |++                                                | 2 % ~32s          
  |++                                                | 3 % ~33s          
  |+++                                               | 4 % ~33s          
  |+++                                               | 5 % ~33s          
  |++++                                              | 6 % ~33s          
  |++++                                              | 7 % ~32s          
  |+++++                                             | 8 % ~32s          
  |+++++                                             | 9 % ~32s          
  |++++++                                            | 10% ~31s          
  |++++++                                            | 11% ~31s          
  |+++++++                                           | 12% ~31s          
  |+++++++                                           | 13% ~31s          
  |++++++++                                          | 14% ~30s          
  |++++++++                                          | 15% ~30s          
  |+++++++++                                         | 16% ~30s          
  |+++++++++                                         | 17% ~31s          
  |++++++++++                                        | 18% ~30s          
  |++++++++++                                        | 19% ~30s          
  |+++++++++++                                       | 20% ~29s          
  |+++++++++++                                       | 21% ~29s          
  |++++++++++++                                      | 22% ~28s          
  |++++++++++++                                      | 23% ~28s          
  |+++++++++++++                                     | 24% ~28s          
  |+++++++++++++                                     | 25% ~27s          
  |++++++++++++++                                    | 26% ~27s          
  |++++++++++++++                                    | 27% ~26s          
  |+++++++++++++++                                   | 28% ~26s          
  |+++++++++++++++                                   | 29% ~25s          
  |++++++++++++++++                                  | 30% ~25s          
  |++++++++++++++++                                  | 31% ~25s          
  |+++++++++++++++++                                 | 32% ~24s          
  |+++++++++++++++++                                 | 33% ~24s          
  |++++++++++++++++++                                | 34% ~24s          
  |++++++++++++++++++                                | 35% ~23s          
  |+++++++++++++++++++                               | 36% ~23s          
  |+++++++++++++++++++                               | 37% ~22s          
  |++++++++++++++++++++                              | 38% ~22s          
  |++++++++++++++++++++                              | 39% ~22s          
  |+++++++++++++++++++++                             | 40% ~21s          
  |+++++++++++++++++++++                             | 41% ~21s          
  |++++++++++++++++++++++                            | 42% ~21s          
  |++++++++++++++++++++++                            | 43% ~20s          
  |+++++++++++++++++++++++                           | 44% ~20s          
  |+++++++++++++++++++++++                           | 45% ~20s          
  |++++++++++++++++++++++++                          | 46% ~19s          
  |++++++++++++++++++++++++                          | 47% ~19s          
  |+++++++++++++++++++++++++                         | 48% ~19s          
  |+++++++++++++++++++++++++                         | 49% ~18s          
  |++++++++++++++++++++++++++                        | 51% ~18s          
  |++++++++++++++++++++++++++                        | 52% ~18s          
  |+++++++++++++++++++++++++++                       | 53% ~17s          
  |+++++++++++++++++++++++++++                       | 54% ~17s          
  |++++++++++++++++++++++++++++                      | 55% ~17s          
  |++++++++++++++++++++++++++++                      | 56% ~16s          
  |+++++++++++++++++++++++++++++                     | 57% ~16s          
  |+++++++++++++++++++++++++++++                     | 58% ~15s          
  |++++++++++++++++++++++++++++++                    | 59% ~15s          
  |++++++++++++++++++++++++++++++                    | 60% ~15s          
  |+++++++++++++++++++++++++++++++                   | 61% ~14s          
  |+++++++++++++++++++++++++++++++                   | 62% ~14s          
  |++++++++++++++++++++++++++++++++                  | 63% ~14s          
  |++++++++++++++++++++++++++++++++                  | 64% ~13s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~13s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~12s          
  |++++++++++++++++++++++++++++++++++                | 67% ~12s          
  |++++++++++++++++++++++++++++++++++                | 68% ~12s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~11s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~11s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~11s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~10s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~10s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~09s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~09s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~09s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~08s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~08s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~08s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=36s  
Calculating cluster Pericentral LSEC

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~49s          
  |++                                                | 2 % ~50s          
  |++                                                | 3 % ~48s          
  |+++                                               | 4 % ~49s          
  |+++                                               | 5 % ~51s          
  |++++                                              | 6 % ~52s          
  |++++                                              | 7 % ~53s          
  |+++++                                             | 8 % ~53s          
  |+++++                                             | 9 % ~53s          
  |++++++                                            | 10% ~53s          
  |++++++                                            | 11% ~51s          
  |+++++++                                           | 12% ~50s          
  |+++++++                                           | 13% ~49s          
  |++++++++                                          | 14% ~48s          
  |++++++++                                          | 15% ~47s          
  |+++++++++                                         | 16% ~46s          
  |+++++++++                                         | 17% ~46s          
  |++++++++++                                        | 18% ~45s          
  |++++++++++                                        | 19% ~44s          
  |+++++++++++                                       | 20% ~43s          
  |+++++++++++                                       | 21% ~43s          
  |++++++++++++                                      | 22% ~42s          
  |++++++++++++                                      | 23% ~41s          
  |+++++++++++++                                     | 24% ~41s          
  |+++++++++++++                                     | 26% ~40s          
  |++++++++++++++                                    | 27% ~39s          
  |++++++++++++++                                    | 28% ~38s          
  |+++++++++++++++                                   | 29% ~38s          
  |+++++++++++++++                                   | 30% ~37s          
  |++++++++++++++++                                  | 31% ~37s          
  |++++++++++++++++                                  | 32% ~36s          
  |+++++++++++++++++                                 | 33% ~35s          
  |+++++++++++++++++                                 | 34% ~35s          
  |++++++++++++++++++                                | 35% ~34s          
  |++++++++++++++++++                                | 36% ~34s          
  |+++++++++++++++++++                               | 37% ~33s          
  |+++++++++++++++++++                               | 38% ~33s          
  |++++++++++++++++++++                              | 39% ~32s          
  |++++++++++++++++++++                              | 40% ~31s          
  |+++++++++++++++++++++                             | 41% ~31s          
  |+++++++++++++++++++++                             | 42% ~30s          
  |++++++++++++++++++++++                            | 43% ~30s          
  |++++++++++++++++++++++                            | 44% ~29s          
  |+++++++++++++++++++++++                           | 45% ~29s          
  |+++++++++++++++++++++++                           | 46% ~28s          
  |++++++++++++++++++++++++                          | 47% ~27s          
  |++++++++++++++++++++++++                          | 48% ~27s          
  |+++++++++++++++++++++++++                         | 49% ~26s          
  |+++++++++++++++++++++++++                         | 50% ~26s          
  |++++++++++++++++++++++++++                        | 51% ~25s          
  |+++++++++++++++++++++++++++                       | 52% ~25s          
  |+++++++++++++++++++++++++++                       | 53% ~24s          
  |++++++++++++++++++++++++++++                      | 54% ~24s          
  |++++++++++++++++++++++++++++                      | 55% ~23s          
  |+++++++++++++++++++++++++++++                     | 56% ~23s          
  |+++++++++++++++++++++++++++++                     | 57% ~22s          
  |++++++++++++++++++++++++++++++                    | 58% ~22s          
  |++++++++++++++++++++++++++++++                    | 59% ~21s          
  |+++++++++++++++++++++++++++++++                   | 60% ~20s          
  |+++++++++++++++++++++++++++++++                   | 61% ~20s          
  |++++++++++++++++++++++++++++++++                  | 62% ~19s          
  |++++++++++++++++++++++++++++++++                  | 63% ~19s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~18s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~18s          
  |++++++++++++++++++++++++++++++++++                | 66% ~17s          
  |++++++++++++++++++++++++++++++++++                | 67% ~17s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~16s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~16s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~15s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~15s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~14s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~14s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~13s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~13s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~12s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~11s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~11s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=51s  
Calculating cluster LSEC (high MT 2)

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~02m 22s      
  |++                                                | 2 % ~02m 24s      
  |++                                                | 3 % ~02m 22s      
  |+++                                               | 4 % ~02m 21s      
  |+++                                               | 5 % ~02m 19s      
  |++++                                              | 6 % ~02m 18s      
  |++++                                              | 7 % ~02m 16s      
  |+++++                                             | 8 % ~02m 15s      
  |+++++                                             | 9 % ~02m 13s      
  |++++++                                            | 10% ~02m 12s      
  |++++++                                            | 11% ~02m 10s      
  |+++++++                                           | 12% ~02m 08s      
  |+++++++                                           | 13% ~02m 07s      
  |++++++++                                          | 14% ~02m 06s      
  |++++++++                                          | 15% ~02m 04s      
  |+++++++++                                         | 16% ~02m 03s      
  |+++++++++                                         | 17% ~02m 01s      
  |++++++++++                                        | 18% ~01m 60s      
  |++++++++++                                        | 19% ~01m 58s      
  |+++++++++++                                       | 20% ~01m 57s      
  |+++++++++++                                       | 21% ~01m 55s      
  |++++++++++++                                      | 22% ~01m 54s      
  |++++++++++++                                      | 23% ~01m 52s      
  |+++++++++++++                                     | 24% ~01m 51s      
  |+++++++++++++                                     | 25% ~01m 51s      
  |++++++++++++++                                    | 26% ~01m 50s      
  |++++++++++++++                                    | 27% ~01m 48s      
  |+++++++++++++++                                   | 28% ~01m 47s      
  |+++++++++++++++                                   | 29% ~01m 45s      
  |++++++++++++++++                                  | 30% ~01m 44s      
  |++++++++++++++++                                  | 31% ~01m 42s      
  |+++++++++++++++++                                 | 32% ~01m 41s      
  |+++++++++++++++++                                 | 33% ~01m 39s      
  |++++++++++++++++++                                | 34% ~01m 38s      
  |++++++++++++++++++                                | 35% ~01m 36s      
  |+++++++++++++++++++                               | 36% ~01m 34s      
  |+++++++++++++++++++                               | 37% ~01m 33s      
  |++++++++++++++++++++                              | 38% ~01m 31s      
  |++++++++++++++++++++                              | 39% ~01m 30s      
  |+++++++++++++++++++++                             | 40% ~01m 28s      
  |+++++++++++++++++++++                             | 41% ~01m 27s      
  |++++++++++++++++++++++                            | 42% ~01m 25s      
  |++++++++++++++++++++++                            | 43% ~01m 24s      
  |+++++++++++++++++++++++                           | 44% ~01m 22s      
  |+++++++++++++++++++++++                           | 45% ~01m 21s      
  |++++++++++++++++++++++++                          | 46% ~01m 19s      
  |++++++++++++++++++++++++                          | 47% ~01m 18s      
  |+++++++++++++++++++++++++                         | 48% ~01m 16s      
  |+++++++++++++++++++++++++                         | 49% ~01m 15s      
  |++++++++++++++++++++++++++                        | 51% ~01m 13s      
  |++++++++++++++++++++++++++                        | 52% ~01m 12s      
  |+++++++++++++++++++++++++++                       | 53% ~01m 10s      
  |+++++++++++++++++++++++++++                       | 54% ~01m 09s      
  |++++++++++++++++++++++++++++                      | 55% ~01m 07s      
  |++++++++++++++++++++++++++++                      | 56% ~01m 06s      
  |+++++++++++++++++++++++++++++                     | 57% ~01m 04s      
  |+++++++++++++++++++++++++++++                     | 58% ~01m 03s      
  |++++++++++++++++++++++++++++++                    | 59% ~01m 01s      
  |++++++++++++++++++++++++++++++                    | 60% ~60s          
  |+++++++++++++++++++++++++++++++                   | 61% ~58s          
  |+++++++++++++++++++++++++++++++                   | 62% ~57s          
  |++++++++++++++++++++++++++++++++                  | 63% ~55s          
  |++++++++++++++++++++++++++++++++                  | 64% ~54s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~52s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~51s          
  |++++++++++++++++++++++++++++++++++                | 67% ~49s          
  |++++++++++++++++++++++++++++++++++                | 68% ~48s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~46s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~45s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~43s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~42s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~40s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~39s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~37s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~36s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~34s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~33s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~31s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~30s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~28s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~27s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~25s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~24s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~22s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~21s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~19s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~18s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~16s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~15s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~13s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~12s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02m 27s
Calculating cluster Midzonal LSEC

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~24s          
  |++                                                | 2 % ~24s          
  |++                                                | 3 % ~24s          
  |+++                                               | 4 % ~24s          
  |+++                                               | 5 % ~24s          
  |++++                                              | 6 % ~24s          
  |++++                                              | 7 % ~24s          
  |+++++                                             | 8 % ~23s          
  |+++++                                             | 9 % ~23s          
  |++++++                                            | 10% ~23s          
  |++++++                                            | 11% ~23s          
  |+++++++                                           | 12% ~22s          
  |+++++++                                           | 13% ~22s          
  |++++++++                                          | 14% ~22s          
  |++++++++                                          | 15% ~22s          
  |+++++++++                                         | 16% ~21s          
  |+++++++++                                         | 17% ~21s          
  |++++++++++                                        | 18% ~21s          
  |++++++++++                                        | 19% ~20s          
  |+++++++++++                                       | 20% ~20s          
  |+++++++++++                                       | 21% ~20s          
  |++++++++++++                                      | 22% ~20s          
  |++++++++++++                                      | 23% ~19s          
  |+++++++++++++                                     | 24% ~19s          
  |+++++++++++++                                     | 25% ~19s          
  |++++++++++++++                                    | 26% ~19s          
  |++++++++++++++                                    | 27% ~18s          
  |+++++++++++++++                                   | 28% ~18s          
  |+++++++++++++++                                   | 29% ~18s          
  |++++++++++++++++                                  | 30% ~18s          
  |++++++++++++++++                                  | 31% ~17s          
  |+++++++++++++++++                                 | 32% ~17s          
  |+++++++++++++++++                                 | 33% ~17s          
  |++++++++++++++++++                                | 34% ~17s          
  |++++++++++++++++++                                | 35% ~16s          
  |+++++++++++++++++++                               | 36% ~16s          
  |+++++++++++++++++++                               | 37% ~16s          
  |++++++++++++++++++++                              | 38% ~16s          
  |++++++++++++++++++++                              | 39% ~15s          
  |+++++++++++++++++++++                             | 40% ~15s          
  |+++++++++++++++++++++                             | 41% ~15s          
  |++++++++++++++++++++++                            | 42% ~15s          
  |++++++++++++++++++++++                            | 43% ~14s          
  |+++++++++++++++++++++++                           | 44% ~14s          
  |+++++++++++++++++++++++                           | 45% ~14s          
  |++++++++++++++++++++++++                          | 46% ~14s          
  |++++++++++++++++++++++++                          | 47% ~13s          
  |+++++++++++++++++++++++++                         | 48% ~13s          
  |+++++++++++++++++++++++++                         | 49% ~13s          
  |++++++++++++++++++++++++++                        | 51% ~13s          
  |++++++++++++++++++++++++++                        | 52% ~12s          
  |+++++++++++++++++++++++++++                       | 53% ~12s          
  |+++++++++++++++++++++++++++                       | 54% ~12s          
  |++++++++++++++++++++++++++++                      | 55% ~12s          
  |++++++++++++++++++++++++++++                      | 56% ~11s          
  |+++++++++++++++++++++++++++++                     | 57% ~11s          
  |+++++++++++++++++++++++++++++                     | 58% ~11s          
  |++++++++++++++++++++++++++++++                    | 59% ~11s          
  |++++++++++++++++++++++++++++++                    | 60% ~10s          
  |+++++++++++++++++++++++++++++++                   | 61% ~10s          
  |+++++++++++++++++++++++++++++++                   | 62% ~10s          
  |++++++++++++++++++++++++++++++++                  | 63% ~10s          
  |++++++++++++++++++++++++++++++++                  | 64% ~09s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~09s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~09s          
  |++++++++++++++++++++++++++++++++++                | 67% ~09s          
  |++++++++++++++++++++++++++++++++++                | 68% ~08s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~08s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~08s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~07s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~07s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~07s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~07s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~06s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~06s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~06s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~06s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=26s  
Calculating cluster LSEC (high MT 1)

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~02m 19s      
  |++                                                | 2 % ~02m 18s      
  |++                                                | 3 % ~02m 16s      
  |+++                                               | 4 % ~02m 16s      
  |+++                                               | 5 % ~02m 14s      
  |++++                                              | 6 % ~02m 13s      
  |++++                                              | 7 % ~02m 11s      
  |+++++                                             | 8 % ~02m 09s      
  |+++++                                             | 9 % ~02m 08s      
  |++++++                                            | 10% ~02m 06s      
  |++++++                                            | 11% ~02m 05s      
  |+++++++                                           | 12% ~02m 03s      
  |+++++++                                           | 13% ~02m 02s      
  |++++++++                                          | 14% ~02m 00s      
  |++++++++                                          | 15% ~01m 59s      
  |+++++++++                                         | 16% ~01m 57s      
  |+++++++++                                         | 18% ~01m 56s      
  |++++++++++                                        | 19% ~01m 54s      
  |++++++++++                                        | 20% ~01m 53s      
  |+++++++++++                                       | 21% ~01m 51s      
  |+++++++++++                                       | 22% ~01m 50s      
  |++++++++++++                                      | 23% ~01m 49s      
  |++++++++++++                                      | 24% ~01m 47s      
  |+++++++++++++                                     | 25% ~01m 46s      
  |+++++++++++++                                     | 26% ~01m 44s      
  |++++++++++++++                                    | 27% ~01m 43s      
  |++++++++++++++                                    | 28% ~01m 41s      
  |+++++++++++++++                                   | 29% ~01m 40s      
  |+++++++++++++++                                   | 30% ~01m 38s      
  |++++++++++++++++                                  | 31% ~01m 37s      
  |++++++++++++++++                                  | 32% ~01m 35s      
  |+++++++++++++++++                                 | 33% ~01m 34s      
  |++++++++++++++++++                                | 34% ~01m 33s      
  |++++++++++++++++++                                | 35% ~01m 31s      
  |+++++++++++++++++++                               | 36% ~01m 30s      
  |+++++++++++++++++++                               | 37% ~01m 28s      
  |++++++++++++++++++++                              | 38% ~01m 27s      
  |++++++++++++++++++++                              | 39% ~01m 25s      
  |+++++++++++++++++++++                             | 40% ~01m 24s      
  |+++++++++++++++++++++                             | 41% ~01m 23s      
  |++++++++++++++++++++++                            | 42% ~01m 21s      
  |++++++++++++++++++++++                            | 43% ~01m 20s      
  |+++++++++++++++++++++++                           | 44% ~01m 18s      
  |+++++++++++++++++++++++                           | 45% ~01m 17s      
  |++++++++++++++++++++++++                          | 46% ~01m 16s      
  |++++++++++++++++++++++++                          | 47% ~01m 14s      
  |+++++++++++++++++++++++++                         | 48% ~01m 13s      
  |+++++++++++++++++++++++++                         | 49% ~01m 11s      
  |++++++++++++++++++++++++++                        | 51% ~01m 10s      
  |++++++++++++++++++++++++++                        | 52% ~01m 08s      
  |+++++++++++++++++++++++++++                       | 53% ~01m 07s      
  |+++++++++++++++++++++++++++                       | 54% ~01m 05s      
  |++++++++++++++++++++++++++++                      | 55% ~01m 04s      
  |++++++++++++++++++++++++++++                      | 56% ~01m 02s      
  |+++++++++++++++++++++++++++++                     | 57% ~01m 01s      
  |+++++++++++++++++++++++++++++                     | 58% ~60s          
  |++++++++++++++++++++++++++++++                    | 59% ~58s          
  |++++++++++++++++++++++++++++++                    | 60% ~57s          
  |+++++++++++++++++++++++++++++++                   | 61% ~55s          
  |+++++++++++++++++++++++++++++++                   | 62% ~54s          
  |++++++++++++++++++++++++++++++++                  | 63% ~52s          
  |++++++++++++++++++++++++++++++++                  | 64% ~51s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~49s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~48s          
  |++++++++++++++++++++++++++++++++++                | 67% ~47s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~45s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~44s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~42s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~41s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~40s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~38s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~37s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~36s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~34s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~33s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~31s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~30s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~28s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~27s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~25s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~24s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~22s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~21s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~19s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~18s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~16s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~15s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~13s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~12s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02m 23s
Calculating cluster LSEC (interferon)

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~03m 12s      
  |++                                                | 2 % ~03m 12s      
  |++                                                | 3 % ~03m 11s      
  |+++                                               | 4 % ~03m 09s      
  |+++                                               | 5 % ~03m 06s      
  |++++                                              | 6 % ~03m 04s      
  |++++                                              | 7 % ~03m 02s      
  |+++++                                             | 8 % ~03m 00s      
  |+++++                                             | 9 % ~02m 58s      
  |++++++                                            | 10% ~02m 56s      
  |++++++                                            | 11% ~02m 54s      
  |+++++++                                           | 12% ~02m 52s      
  |+++++++                                           | 13% ~02m 50s      
  |++++++++                                          | 14% ~02m 48s      
  |++++++++                                          | 15% ~02m 46s      
  |+++++++++                                         | 16% ~02m 44s      
  |+++++++++                                         | 17% ~02m 42s      
  |++++++++++                                        | 18% ~02m 40s      
  |++++++++++                                        | 19% ~02m 39s      
  |+++++++++++                                       | 20% ~02m 36s      
  |+++++++++++                                       | 21% ~02m 35s      
  |++++++++++++                                      | 22% ~02m 33s      
  |++++++++++++                                      | 23% ~02m 31s      
  |+++++++++++++                                     | 24% ~02m 29s      
  |+++++++++++++                                     | 26% ~02m 27s      
  |++++++++++++++                                    | 27% ~02m 25s      
  |++++++++++++++                                    | 28% ~02m 23s      
  |+++++++++++++++                                   | 29% ~02m 21s      
  |+++++++++++++++                                   | 30% ~02m 19s      
  |++++++++++++++++                                  | 31% ~02m 17s      
  |++++++++++++++++                                  | 32% ~02m 15s      
  |+++++++++++++++++                                 | 33% ~02m 13s      
  |+++++++++++++++++                                 | 34% ~02m 11s      
  |++++++++++++++++++                                | 35% ~02m 09s      
  |++++++++++++++++++                                | 36% ~02m 07s      
  |+++++++++++++++++++                               | 37% ~02m 05s      
  |+++++++++++++++++++                               | 38% ~02m 03s      
  |++++++++++++++++++++                              | 39% ~02m 01s      
  |++++++++++++++++++++                              | 40% ~01m 59s      
  |+++++++++++++++++++++                             | 41% ~01m 57s      
  |+++++++++++++++++++++                             | 42% ~01m 55s      
  |++++++++++++++++++++++                            | 43% ~01m 53s      
  |++++++++++++++++++++++                            | 44% ~01m 51s      
  |+++++++++++++++++++++++                           | 45% ~01m 49s      
  |+++++++++++++++++++++++                           | 46% ~01m 47s      
  |++++++++++++++++++++++++                          | 47% ~01m 45s      
  |++++++++++++++++++++++++                          | 48% ~01m 43s      
  |+++++++++++++++++++++++++                         | 49% ~01m 41s      
  |+++++++++++++++++++++++++                         | 50% ~01m 39s      
  |++++++++++++++++++++++++++                        | 51% ~01m 37s      
  |+++++++++++++++++++++++++++                       | 52% ~01m 35s      
  |+++++++++++++++++++++++++++                       | 53% ~01m 33s      
  |++++++++++++++++++++++++++++                      | 54% ~01m 31s      
  |++++++++++++++++++++++++++++                      | 55% ~01m 29s      
  |+++++++++++++++++++++++++++++                     | 56% ~01m 27s      
  |+++++++++++++++++++++++++++++                     | 57% ~01m 25s      
  |++++++++++++++++++++++++++++++                    | 58% ~01m 23s      
  |++++++++++++++++++++++++++++++                    | 59% ~01m 21s      
  |+++++++++++++++++++++++++++++++                   | 60% ~01m 19s      
  |+++++++++++++++++++++++++++++++                   | 61% ~01m 17s      
  |++++++++++++++++++++++++++++++++                  | 62% ~01m 15s      
  |++++++++++++++++++++++++++++++++                  | 63% ~01m 13s      
  |+++++++++++++++++++++++++++++++++                 | 64% ~01m 11s      
  |+++++++++++++++++++++++++++++++++                 | 65% ~01m 09s      
  |++++++++++++++++++++++++++++++++++                | 66% ~01m 07s      
  |++++++++++++++++++++++++++++++++++                | 67% ~01m 05s      
  |+++++++++++++++++++++++++++++++++++               | 68% ~01m 03s      
  |+++++++++++++++++++++++++++++++++++               | 69% ~01m 01s      
  |++++++++++++++++++++++++++++++++++++              | 70% ~59s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~57s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~55s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~53s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~51s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~49s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~47s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~45s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~43s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~41s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~39s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~37s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~35s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~33s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~31s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~29s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~27s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~25s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~23s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~21s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~18s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~16s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~14s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~12s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03m 21s
Calculating cluster Periportal LSEC

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 34s      
  |++                                                | 2 % ~01m 33s      
  |++                                                | 3 % ~01m 33s      
  |+++                                               | 4 % ~01m 32s      
  |+++                                               | 5 % ~01m 31s      
  |++++                                              | 6 % ~01m 30s      
  |++++                                              | 7 % ~01m 29s      
  |+++++                                             | 8 % ~01m 28s      
  |+++++                                             | 9 % ~01m 27s      
  |++++++                                            | 10% ~01m 26s      
  |++++++                                            | 11% ~01m 25s      
  |+++++++                                           | 12% ~01m 23s      
  |+++++++                                           | 13% ~01m 22s      
  |++++++++                                          | 14% ~01m 22s      
  |++++++++                                          | 15% ~01m 21s      
  |+++++++++                                         | 16% ~01m 20s      
  |+++++++++                                         | 18% ~01m 19s      
  |++++++++++                                        | 19% ~01m 18s      
  |++++++++++                                        | 20% ~01m 17s      
  |+++++++++++                                       | 21% ~01m 16s      
  |+++++++++++                                       | 22% ~01m 15s      
  |++++++++++++                                      | 23% ~01m 14s      
  |++++++++++++                                      | 24% ~01m 13s      
  |+++++++++++++                                     | 25% ~01m 12s      
  |+++++++++++++                                     | 26% ~01m 11s      
  |++++++++++++++                                    | 27% ~01m 10s      
  |++++++++++++++                                    | 28% ~01m 09s      
  |+++++++++++++++                                   | 29% ~01m 08s      
  |+++++++++++++++                                   | 30% ~01m 07s      
  |++++++++++++++++                                  | 31% ~01m 06s      
  |++++++++++++++++                                  | 32% ~01m 05s      
  |+++++++++++++++++                                 | 33% ~01m 04s      
  |++++++++++++++++++                                | 34% ~01m 03s      
  |++++++++++++++++++                                | 35% ~01m 02s      
  |+++++++++++++++++++                               | 36% ~01m 01s      
  |+++++++++++++++++++                               | 37% ~01m 00s      
  |++++++++++++++++++++                              | 38% ~59s          
  |++++++++++++++++++++                              | 39% ~58s          
  |+++++++++++++++++++++                             | 40% ~57s          
  |+++++++++++++++++++++                             | 41% ~56s          
  |++++++++++++++++++++++                            | 42% ~55s          
  |++++++++++++++++++++++                            | 43% ~54s          
  |+++++++++++++++++++++++                           | 44% ~53s          
  |+++++++++++++++++++++++                           | 45% ~52s          
  |++++++++++++++++++++++++                          | 46% ~51s          
  |++++++++++++++++++++++++                          | 47% ~50s          
  |+++++++++++++++++++++++++                         | 48% ~49s          
  |+++++++++++++++++++++++++                         | 49% ~48s          
  |++++++++++++++++++++++++++                        | 51% ~47s          
  |++++++++++++++++++++++++++                        | 52% ~46s          
  |+++++++++++++++++++++++++++                       | 53% ~45s          
  |+++++++++++++++++++++++++++                       | 54% ~44s          
  |++++++++++++++++++++++++++++                      | 55% ~43s          
  |++++++++++++++++++++++++++++                      | 56% ~42s          
  |+++++++++++++++++++++++++++++                     | 57% ~41s          
  |+++++++++++++++++++++++++++++                     | 58% ~40s          
  |++++++++++++++++++++++++++++++                    | 59% ~39s          
  |++++++++++++++++++++++++++++++                    | 60% ~38s          
  |+++++++++++++++++++++++++++++++                   | 61% ~37s          
  |+++++++++++++++++++++++++++++++                   | 62% ~36s          
  |++++++++++++++++++++++++++++++++                  | 63% ~36s          
  |++++++++++++++++++++++++++++++++                  | 64% ~35s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~34s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~33s          
  |++++++++++++++++++++++++++++++++++                | 67% ~32s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~31s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~30s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~29s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~28s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~27s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~26s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~25s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~24s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~23s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~22s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~21s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~20s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~19s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~18s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~17s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~16s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~15s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~14s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~13s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~12s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~11s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01m 35s
Calculating cluster LSEC (fenestr.)

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 60s      
  |++                                                | 2 % ~01m 60s      
  |++                                                | 3 % ~01m 59s      
  |+++                                               | 4 % ~01m 58s      
  |+++                                               | 5 % ~01m 56s      
  |++++                                              | 6 % ~01m 55s      
  |++++                                              | 7 % ~01m 53s      
  |+++++                                             | 8 % ~01m 52s      
  |+++++                                             | 9 % ~01m 51s      
  |++++++                                            | 10% ~01m 50s      
  |++++++                                            | 11% ~01m 48s      
  |+++++++                                           | 12% ~01m 49s      
  |+++++++                                           | 13% ~01m 47s      
  |++++++++                                          | 14% ~01m 46s      
  |++++++++                                          | 15% ~01m 45s      
  |+++++++++                                         | 16% ~01m 44s      
  |+++++++++                                         | 17% ~01m 42s      
  |++++++++++                                        | 18% ~01m 41s      
  |++++++++++                                        | 19% ~01m 40s      
  |+++++++++++                                       | 20% ~01m 38s      
  |+++++++++++                                       | 21% ~01m 37s      
  |++++++++++++                                      | 22% ~01m 36s      
  |++++++++++++                                      | 23% ~01m 35s      
  |+++++++++++++                                     | 24% ~01m 33s      
  |+++++++++++++                                     | 26% ~01m 32s      
  |++++++++++++++                                    | 27% ~01m 31s      
  |++++++++++++++                                    | 28% ~01m 29s      
  |+++++++++++++++                                   | 29% ~01m 28s      
  |+++++++++++++++                                   | 30% ~01m 27s      
  |++++++++++++++++                                  | 31% ~01m 26s      
  |++++++++++++++++                                  | 32% ~01m 24s      
  |+++++++++++++++++                                 | 33% ~01m 23s      
  |+++++++++++++++++                                 | 34% ~01m 22s      
  |++++++++++++++++++                                | 35% ~01m 21s      
  |++++++++++++++++++                                | 36% ~01m 19s      
  |+++++++++++++++++++                               | 37% ~01m 18s      
  |+++++++++++++++++++                               | 38% ~01m 17s      
  |++++++++++++++++++++                              | 39% ~01m 15s      
  |++++++++++++++++++++                              | 40% ~01m 14s      
  |+++++++++++++++++++++                             | 41% ~01m 13s      
  |+++++++++++++++++++++                             | 42% ~01m 12s      
  |++++++++++++++++++++++                            | 43% ~01m 10s      
  |++++++++++++++++++++++                            | 44% ~01m 09s      
  |+++++++++++++++++++++++                           | 45% ~01m 08s      
  |+++++++++++++++++++++++                           | 46% ~01m 07s      
  |++++++++++++++++++++++++                          | 47% ~01m 05s      
  |++++++++++++++++++++++++                          | 48% ~01m 04s      
  |+++++++++++++++++++++++++                         | 49% ~01m 03s      
  |+++++++++++++++++++++++++                         | 50% ~01m 02s      
  |++++++++++++++++++++++++++                        | 51% ~01m 00s      
  |+++++++++++++++++++++++++++                       | 52% ~59s          
  |+++++++++++++++++++++++++++                       | 53% ~58s          
  |++++++++++++++++++++++++++++                      | 54% ~57s          
  |++++++++++++++++++++++++++++                      | 55% ~56s          
  |+++++++++++++++++++++++++++++                     | 56% ~54s          
  |+++++++++++++++++++++++++++++                     | 57% ~53s          
  |++++++++++++++++++++++++++++++                    | 58% ~52s          
  |++++++++++++++++++++++++++++++                    | 59% ~50s          
  |+++++++++++++++++++++++++++++++                   | 60% ~49s          
  |+++++++++++++++++++++++++++++++                   | 61% ~48s          
  |++++++++++++++++++++++++++++++++                  | 62% ~47s          
  |++++++++++++++++++++++++++++++++                  | 63% ~45s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~44s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~43s          
  |++++++++++++++++++++++++++++++++++                | 66% ~42s          
  |++++++++++++++++++++++++++++++++++                | 67% ~40s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~39s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~38s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~36s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~35s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~34s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~33s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~31s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~30s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~29s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~28s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~26s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~25s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~24s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~23s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~21s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~20s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~19s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~18s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~16s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~15s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~14s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~13s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~11s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02m 03s
Calculating cluster Lymphatic EC

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~02m 14s      
  |+                                                 | 2 % ~02m 13s      
  |++                                                | 3 % ~02m 13s      
  |++                                                | 4 % ~02m 11s      
  |+++                                               | 5 % ~02m 10s      
  |+++                                               | 6 % ~02m 09s      
  |++++                                              | 7 % ~02m 11s      
  |++++                                              | 8 % ~02m 10s      
  |+++++                                             | 9 % ~02m 08s      
  |+++++                                             | 10% ~02m 06s      
  |++++++                                            | 11% ~02m 05s      
  |++++++                                            | 12% ~02m 11s      
  |+++++++                                           | 13% ~02m 08s      
  |+++++++                                           | 14% ~02m 06s      
  |++++++++                                          | 15% ~02m 04s      
  |++++++++                                          | 16% ~02m 02s      
  |+++++++++                                         | 17% ~02m 00s      
  |+++++++++                                         | 18% ~01m 59s      
  |++++++++++                                        | 19% ~01m 57s      
  |++++++++++                                        | 20% ~01m 55s      
  |+++++++++++                                       | 21% ~01m 54s      
  |+++++++++++                                       | 22% ~01m 52s      
  |++++++++++++                                      | 23% ~01m 50s      
  |++++++++++++                                      | 24% ~01m 49s      
  |+++++++++++++                                     | 25% ~01m 47s      
  |+++++++++++++                                     | 26% ~01m 45s      
  |++++++++++++++                                    | 27% ~01m 44s      
  |++++++++++++++                                    | 28% ~01m 42s      
  |+++++++++++++++                                   | 29% ~01m 41s      
  |+++++++++++++++                                   | 30% ~01m 39s      
  |++++++++++++++++                                  | 31% ~01m 38s      
  |++++++++++++++++                                  | 32% ~01m 36s      
  |+++++++++++++++++                                 | 33% ~01m 35s      
  |+++++++++++++++++                                 | 34% ~01m 33s      
  |++++++++++++++++++                                | 35% ~01m 32s      
  |++++++++++++++++++                                | 36% ~01m 30s      
  |+++++++++++++++++++                               | 37% ~01m 29s      
  |+++++++++++++++++++                               | 38% ~01m 27s      
  |++++++++++++++++++++                              | 39% ~01m 26s      
  |++++++++++++++++++++                              | 40% ~01m 25s      
  |+++++++++++++++++++++                             | 41% ~01m 24s      
  |+++++++++++++++++++++                             | 42% ~01m 23s      
  |++++++++++++++++++++++                            | 43% ~01m 22s      
  |++++++++++++++++++++++                            | 44% ~01m 21s      
  |+++++++++++++++++++++++                           | 45% ~01m 19s      
  |+++++++++++++++++++++++                           | 46% ~01m 18s      
  |++++++++++++++++++++++++                          | 47% ~01m 16s      
  |++++++++++++++++++++++++                          | 48% ~01m 15s      
  |+++++++++++++++++++++++++                         | 49% ~01m 13s      
  |+++++++++++++++++++++++++                         | 50% ~01m 12s      
  |++++++++++++++++++++++++++                        | 51% ~01m 10s      
  |++++++++++++++++++++++++++                        | 52% ~01m 09s      
  |+++++++++++++++++++++++++++                       | 53% ~01m 07s      
  |+++++++++++++++++++++++++++                       | 54% ~01m 06s      
  |++++++++++++++++++++++++++++                      | 55% ~01m 04s      
  |++++++++++++++++++++++++++++                      | 56% ~01m 03s      
  |+++++++++++++++++++++++++++++                     | 57% ~01m 01s      
  |+++++++++++++++++++++++++++++                     | 58% ~60s          
  |++++++++++++++++++++++++++++++                    | 59% ~58s          
  |++++++++++++++++++++++++++++++                    | 60% ~57s          
  |+++++++++++++++++++++++++++++++                   | 61% ~55s          
  |+++++++++++++++++++++++++++++++                   | 62% ~54s          
  |++++++++++++++++++++++++++++++++                  | 63% ~53s          
  |++++++++++++++++++++++++++++++++                  | 64% ~51s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~50s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~48s          
  |++++++++++++++++++++++++++++++++++                | 67% ~47s          
  |++++++++++++++++++++++++++++++++++                | 68% ~45s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~44s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~42s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~41s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~40s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~38s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~37s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~35s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~34s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~32s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~31s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~30s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~28s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~27s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~25s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~24s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~23s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~21s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~20s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~18s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~17s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~15s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~14s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~13s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~11s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02m 19s
Calculating cluster Cycling cells

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~02m 53s      
  |+                                                 | 2 % ~02m 52s      
  |++                                                | 3 % ~02m 50s      
  |++                                                | 4 % ~02m 48s      
  |+++                                               | 5 % ~02m 47s      
  |+++                                               | 6 % ~02m 45s      
  |++++                                              | 7 % ~02m 43s      
  |++++                                              | 8 % ~02m 41s      
  |+++++                                             | 9 % ~02m 39s      
  |+++++                                             | 10% ~02m 38s      
  |++++++                                            | 11% ~02m 36s      
  |++++++                                            | 12% ~02m 34s      
  |+++++++                                           | 13% ~02m 33s      
  |+++++++                                           | 14% ~02m 31s      
  |++++++++                                          | 15% ~02m 29s      
  |++++++++                                          | 16% ~02m 27s      
  |+++++++++                                         | 17% ~02m 26s      
  |+++++++++                                         | 18% ~02m 24s      
  |++++++++++                                        | 19% ~02m 22s      
  |++++++++++                                        | 20% ~02m 20s      
  |+++++++++++                                       | 21% ~02m 19s      
  |+++++++++++                                       | 22% ~02m 17s      
  |++++++++++++                                      | 23% ~02m 15s      
  |++++++++++++                                      | 24% ~02m 13s      
  |+++++++++++++                                     | 25% ~02m 12s      
  |+++++++++++++                                     | 26% ~02m 10s      
  |++++++++++++++                                    | 27% ~02m 08s      
  |++++++++++++++                                    | 28% ~02m 06s      
  |+++++++++++++++                                   | 29% ~02m 05s      
  |+++++++++++++++                                   | 30% ~02m 03s      
  |++++++++++++++++                                  | 31% ~02m 01s      
  |++++++++++++++++                                  | 32% ~01m 59s      
  |+++++++++++++++++                                 | 33% ~01m 58s      
  |+++++++++++++++++                                 | 34% ~01m 56s      
  |++++++++++++++++++                                | 35% ~01m 54s      
  |++++++++++++++++++                                | 36% ~01m 52s      
  |+++++++++++++++++++                               | 37% ~01m 51s      
  |+++++++++++++++++++                               | 38% ~01m 49s      
  |++++++++++++++++++++                              | 39% ~01m 47s      
  |++++++++++++++++++++                              | 40% ~01m 45s      
  |+++++++++++++++++++++                             | 41% ~01m 44s      
  |+++++++++++++++++++++                             | 42% ~01m 42s      
  |++++++++++++++++++++++                            | 43% ~01m 40s      
  |++++++++++++++++++++++                            | 44% ~01m 38s      
  |+++++++++++++++++++++++                           | 45% ~01m 37s      
  |+++++++++++++++++++++++                           | 46% ~01m 35s      
  |++++++++++++++++++++++++                          | 47% ~01m 33s      
  |++++++++++++++++++++++++                          | 48% ~01m 31s      
  |+++++++++++++++++++++++++                         | 49% ~01m 29s      
  |+++++++++++++++++++++++++                         | 50% ~01m 28s      
  |++++++++++++++++++++++++++                        | 51% ~01m 26s      
  |++++++++++++++++++++++++++                        | 52% ~01m 24s      
  |+++++++++++++++++++++++++++                       | 53% ~01m 23s      
  |+++++++++++++++++++++++++++                       | 54% ~01m 21s      
  |++++++++++++++++++++++++++++                      | 55% ~01m 19s      
  |++++++++++++++++++++++++++++                      | 56% ~01m 17s      
  |+++++++++++++++++++++++++++++                     | 57% ~01m 15s      
  |+++++++++++++++++++++++++++++                     | 58% ~01m 14s      
  |++++++++++++++++++++++++++++++                    | 59% ~01m 12s      
  |++++++++++++++++++++++++++++++                    | 60% ~01m 10s      
  |+++++++++++++++++++++++++++++++                   | 61% ~01m 08s      
  |+++++++++++++++++++++++++++++++                   | 62% ~01m 07s      
  |++++++++++++++++++++++++++++++++                  | 63% ~01m 05s      
  |++++++++++++++++++++++++++++++++                  | 64% ~01m 03s      
  |+++++++++++++++++++++++++++++++++                 | 65% ~01m 01s      
  |+++++++++++++++++++++++++++++++++                 | 66% ~60s          
  |++++++++++++++++++++++++++++++++++                | 67% ~58s          
  |++++++++++++++++++++++++++++++++++                | 68% ~56s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~54s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~53s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~51s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~49s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~47s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~46s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~44s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~42s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~41s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~39s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~37s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~35s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~33s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~32s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~30s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~28s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~26s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~25s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~23s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~21s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~19s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~18s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~16s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~14s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~12s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~11s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02m 55s
write.csv(mkend_simp[mkend_simp$p_val_adj<=0.05,], 
          file = "results/endothelial/markers_endo_subpop_simp.csv", row.names = T, quote = F)

Normalise, PCA, UMAP

lsec_list = list(lsec_end_cells = only_end_cells[,only_end_cells$pca25_res.0.9 %in% c(0, 1, 3, 12)])

Get DPT

h_lsec_list = list()
for(n in names(lsec_list)){
  h_lsec_list[[n]] = lsec_list[[n]][,lsec_list[[n]]$Condition=="healthy"]
  h_lsec_list[[n]] = suppressWarnings(SCTransform(h_lsec_list[[n]], do.correct.umi = T, verbose = F, 
                                                  vars.to.regress=c("unique_name","nCount_RNA"),
                                                  variable.features.rv.th = 1, seed.use = 1,
                                                  return.only.var.genes = F, 
                                                  variable.features.n = NULL))
  h_lsec_list[[n]] = RunPCA(h_lsec_list[[n]], verbose = F)
  h_lsec_list[[n]] = RunUMAP(h_lsec_list[[n]], dims = 1:20, verbose = F)
}

Plot DPT as violin

We’re using subset 2 - only bona fide LSEC

for(n in names(h_lsec_list)){
  plot_df = data.frame(row.names = rownames(dpt_l[[n]]@branch), 
                       "cl" = h_lsec_list[[n]]$endo_simp,
                       "dpt" = getDPT(dpt_l[[n]]))
  
  plt = ggplot(plot_df, aes(y = cl, x = dpt, fill = cl))+
    geom_boxplot()+
    labs(title = n)+
    theme_bw()+
    theme(axis.text.x = element_text(size = 7.5))
  print(plt)
}

Plot pseudotime as boxplot

Find genes varying along the pseudotime

plot_df = data.frame(row.names = rownames(dpt@branch), 
                     "cl" = sub_2$endo_simp,
                     "dpt" = getDPT(dpt))

plt = ggplot(plot_df, aes(y = cl, x = rank(dpt), fill = cl))+
  geom_boxplot()+
  theme_bw()+
  theme(axis.text.x = element_text(size = 7.5))
print(plt)

Now use the top genes to learn the pseudozonation coordinates and project the embolised and regenerating data

df_dc = cbind(sub_2@meta.data, 
              data.frame("DC1" = dpt@dm$DC1, "DC2" = dpt@dm$DC2, 
                         "DPT" = scales::rescale(rank(getDPT(dpt)), c(0.00001, 0.99999))))

# will only use variable genes
hvg = sub_2@assays$SCT@var.features

# Fit GAM for each gene using pseudotime as independent variable.
t = df_dc$DPT
gene_fit_p = c()
gene_fit_vals = data.frame(row.names = 1:100)
for(i in 1:length(hvg)){
  g = hvg[i]
  z = sub_2@assays$SCT@data[g,]
  
  d = data.frame(z=z, t=t)
  tmp = suppressMessages(gam(z ~ ns(t, df = 3), data=d))
  
  # bins for model fitting
  bb = seq(min(t), max(t), length.out = 100)
  gene_fit_vals[,g] = suppressMessages(predict(tmp,
                                               newdata = data.frame(t = bb)))
  p = summary(tmp)$parametric.anova$`Pr(>F)`[1]
  gene_fit_p = c(gene_fit_p, p)
  names(gene_fit_p)[length(gene_fit_p)] = g
}

gene_fit_p = fdrtool::fdrtool(gene_fit_p, statistic="pvalue", plot=F, 
                              verbose=F, cutoff.method="pct0", pct0=0.9)$qval
sig_genes = gene_fit_p[gene_fit_p<=0.05]
top_sig_genes = names(sig_genes[order(sig_genes, decreasing = F)][1:1000])
top_sig_genes = top_sig_genes[top_sig_genes %in% rownames(only_end_cells@assays$SCT@data)]

data_gam_h = cbind(data.frame("DPT" = df_dc$DPT),
                   Matrix::t(sub_2@assays$SCT@data[top_sig_genes,]))

gam_healthy = gam::gam(DPT ~ ., data = data_gam_h, 
                       family = mgcv::betar(link = "logit", eps = 0.00001))

all_pred = predict(gam_healthy,
                   Matrix::t(only_end_cells@assays$SCT@data[top_sig_genes,]), type= "response")

goodcl = only_end_cells$pca25_res.0.9 %in% sub_2$pca25_res.0.9
all_pred_sub = all_pred[goodcl & only_end_cells$Condition!="healthy" | names(all_pred) %in% colnames(sub_2)]

traj_list = list("healthy" = data_gam_h$DPT, 
                 "embolised" = all_pred[goodcl & only_end_cells$Condition!="embolised"], 
                 "regenerating" = all_pred[goodcl & only_end_cells$Condition!="regenerating"])

only_end_cells = AddMetaData(only_end_cells, 
                             data.frame("zonation_pt" = all_pred, 
                                        "goodcl" = colnames(only_end_cells) %in% names(all_pred_sub)))
only_end_cells@meta.data[rownames(data_gam_h),"zonation_pt"] = data_gam_h$DPT

plot_df = only_end_cells@meta.data[names(all_pred_sub),]
plot_df$bins100 = cut(plot_df$zonation_pt, 10)
plot_df$Condition = factor(plot_df$Condition, levels = c("healthy", "embolised", "regenerating"))
ggplot(plot_df, aes(x = bins100, fill = endo_simp))+
     facet_wrap(~Condition)+
     geom_bar()+
     labs(x = "zonation (binned)", y = "Number of cells")+
     scale_y_continuous(expand = c(0,0))+
     coord_flip()+
     guides(fill = guide_legend(title.position = "top"))+
  theme_classic()+
     theme(axis.text.y = element_blank(),
           strip.background = element_rect(fill = colcond),
           legend.title.align = 0,
           legend.position = "bottom")

VlnPlot(only_end_cells[,names(all_pred_sub)], features = "nCount_RNA", 
        group.by = "endo_simp", split.by = "Condition")

ggplot(plot_df, aes(x = zonation_pt, y = endo_simp, fill = endo_simp))+
     facet_wrap(~Condition)+
     geom_violin()+
     labs(x = "zonation", y = "clusters")+
     scale_x_continuous(expand = c(0,0))+
     guides(fill = guide_legend(title.position = "top"))+
     theme_bw()+
     theme(axis.text.y = element_blank(),
           legend.title.align = 0,
           legend.position = "bottom")

Do cross validation on the healthy trajectory

plot_df = only_end_cells@meta.data
plot_df$pt = all_pred[colnames(only_end_cells)]
plot_df$bins100 = cut(plot_df$pt, 10)
plot_df$Condition = factor(plot_df$Condition, levels = c("healthy", "embolised", "regenerating"))

ggplot(plot_df, aes(x = pt, y = endo_simp, fill = endo_simp))+
     facet_wrap(~Condition)+
     geom_violin()+
     labs(x = "zonation", y = "clusters")+
     scale_x_continuous(expand = c(0,0))+
     guides(fill = guide_legend(title.position = "top", reverse = T))+
     theme_bw()+
     theme(axis.text.y = element_blank(),
           legend.title.align = 0,
           legend.position = "right")

Find varying genes - using all cells along the ranked pseudotime

sig_genes = gene_fit_p[gene_fit_p<=0.05]
top_sig_genes = names(sig_genes[order(sig_genes, decreasing = F)][1:1000]) 

data_gam_h = cbind(data.frame("DPT" = traj_list$healthy),
                   Matrix::t(sub_2@assays$SCT@data[top_sig_genes,]))
colnames(data_gam_h) = gsub("-", "_", colnames(data_gam_h), fixed = T)
colnames(data_gam_h) = gsub(".", "_", colnames(data_gam_h), fixed = T)

cv_gam = CVgam(data = data_gam_h, formula = DPT ~ ., nfold = 10, seed = 1, method = "glm.fit")
CV-mse-GAM  
      0.044 
pdf("results/endothelial/end_original_fitted_pseudotime.pdf", useDingbats = F, 
    width = 6, height = 5)
plot(data_gam_h$DPT, cv_gam$fitted, xlab = "Healthy pseudotime",ylab = "Predicted Healthy",
     main = paste0("Healthy original vs fitted pseudotime\nMSE: ", round(cv_gam$cvscale, 6)),
     pch = 19, cex = 0.5)
abline(0,1, col = "blue", lwd = 3)
dev.off()
null device 
          1 
plot_df = data.frame("original" = data_gam_h$DPT, "predicted" = cv_gam$fitted)
plot_df$cl = sub_2@meta.data$endo_simp
ggplot(plot_df, aes(x = original, y = predicted, colour = cl))+geom_point()

Correlate genes between conditions

## get varying genes for each condition
numCores = 12 #larger values resulted in problems
start_time <- Sys.time()
cond_fit_list = list()

only_end_cells_bf = only_end_cells[,only_end_cells$pca25_res.0.9 %in% sub_2$pca25_res.0.9]
only_end_cells_split = SplitObject(only_end_cells_bf, split.by = "Condition")

for(cond in names(only_end_cells_split)){
  print(cond)
  
  sub_dat = only_end_cells_split[[cond]]
  # Fit GAM for each gene using pseudotime as independent variable.
  cond_fit_list[[cond]] = mclapply(hvg, fittingFunc, mc.cores = numCores)
}
[1] "healthy"
[1] "embolised"
[1] "regenerating"
end_fits_qval = list()
for(cond in names(cond_fit_list)){
  fits_df = Reduce(cbind, lapply(cond_fit_list[[cond]], function(x) x$fits))
  
  pval_list = unlist(lapply(cond_fit_list[[cond]], function(x) x$pval))
  names(pval_list) = hvg
  
  pval_df = data.frame(pval_list)
  
  end_fits_qval[[cond]] = list("fits" = fits_df, "pval" = pval_df,
                               "fdr" = apply(pval_df, 2, function(x) p.adjust(x, method = "fdr")))
}
end_time <- Sys.time()
end_time - start_time
Time difference of 2.806205 mins
saveRDS(end_fits_qval, file = "results/endothelial/end_fits_qval.RDS")

GO Term enrichment

g = "LYVE1"
plot(end_fits_qval$healthy$fits[,g])
points(end_fits_qval$embolised$fits[,g], col = "red")
points(end_fits_qval$regenerating$fits[,g], col = "blue")


all_var_genes = (end_fits_qval$healthy$fdr<=0.05 & 
  apply(end_fits_qval$healthy$fits, 2, function(x) diff(range(x))>=0.05)) | 
  (end_fits_qval$embolised$fdr<=0.05 & 
  apply(end_fits_qval$embolised$fits, 2, function(x) diff(range(x))>=0.05)) | 
  (end_fits_qval$regenerating$fdr<=0.05 & 
  apply(end_fits_qval$regenerating$fits, 2, function(x) diff(range(x))>=0.05))

end_cor_he = sapply(rownames(all_var_genes)[all_var_genes], 
                    function(g) cor(end_fits_qval$healthy$fits[,g],end_fits_qval$embolised$fits[,g], 
                                    method = "sp"), simplify = T)
end_cor_hr = sapply(rownames(all_var_genes)[all_var_genes], 
                    function(g) cor(end_fits_qval$healthy$fits[,g],end_fits_qval$regenerating$fits[,g], 
                                    method = "sp"), simplify = T)
end_cor_er = sapply(rownames(all_var_genes)[all_var_genes], 
                    function(g) cor(end_fits_qval$embolised$fits[,g],end_fits_qval$regenerating$fits[,g], 
                                    method = "sp"), simplify = T)

cor_g_df = data.frame("gene" = names(end_cor_he), 
                      "HvE" = end_cor_he, "HvR" = end_cor_hr, "EvR" = end_cor_er)
write.csv(cor_g_df, file = "results/endothelial/correlations_zonation_endothelial.csv", 
          row.names = T, quote = F)

Plot top genes in correlation

got_cor = list()
eg_all = clusterProfiler::bitr(colnames(end_fits_qval$healthy$fits), fromType="SYMBOL", 
                             toType="ENTREZID", OrgDb="org.Hs.eg.db")
'select()' returned 1:1 mapping between keys and columns
10.73% of input gene IDs are fail to map...
eg = clusterProfiler::bitr(names(end_cor_he)[end_cor_he<0.3], fromType="SYMBOL", 
                           toType="ENTREZID", OrgDb="org.Hs.eg.db")
'select()' returned 1:1 mapping between keys and columns
5.94% of input gene IDs are fail to map...
got = clusterProfiler::enrichGO(gene = eg$ENTREZID, universe = eg_all$ENTREZID, 
                                OrgDb = org.Hs.eg.db, ont = "BP", pvalueCutoff  = 0.01,
                                qvalueCutoff  = 0.05, 
                                pAdjustMethod = "BH", readable = T)
got_cor[["notcor_he"]] = getTopTerms(got@result[got@result$p.adjust<=0.05,], ncl = 4, nt = 2, topt = 1000)

eg = clusterProfiler::bitr(names(end_cor_he)[end_cor_he>=0.3], fromType="SYMBOL", 
                           toType="ENTREZID", OrgDb="org.Hs.eg.db")
'select()' returned 1:1 mapping between keys and columns
4.83% of input gene IDs are fail to map...
got = clusterProfiler::enrichGO(gene = eg$ENTREZID, universe = eg_all$ENTREZID, 
                                OrgDb = org.Hs.eg.db, ont = "BP", pvalueCutoff  = 0.01,
                                qvalueCutoff  = 0.05, 
                                pAdjustMethod = "BH", readable = T)
got_cor[["cor_he"]] = getTopTerms(got@result[got@result$p.adjust<=0.05,], ncl = 4, nt = 2, topt = 1000)

eg = clusterProfiler::bitr(names(end_cor_hr)[end_cor_hr<0.3], fromType="SYMBOL", 
                           toType="ENTREZID", OrgDb="org.Hs.eg.db")
'select()' returned 1:1 mapping between keys and columns
5.79% of input gene IDs are fail to map...
got = clusterProfiler::enrichGO(gene = eg$ENTREZID, universe = eg_all$ENTREZID, 
                                OrgDb = org.Hs.eg.db, ont = "BP", pvalueCutoff  = 0.01,
                                qvalueCutoff  = 0.05, 
                                pAdjustMethod = "BH", readable = T)
got_cor[["notcor_hr"]] = getTopTerms(got@result[got@result$p.adjust<=0.05,], ncl = 4, nt = 2, topt = 1000)

eg = clusterProfiler::bitr(names(end_cor_hr)[end_cor_hr>=0.3], fromType="SYMBOL", 
                           toType="ENTREZID", OrgDb="org.Hs.eg.db")
'select()' returned 1:1 mapping between keys and columns
4.9% of input gene IDs are fail to map...
got = clusterProfiler::enrichGO(gene = eg$ENTREZID, universe = eg_all$ENTREZID, 
                                OrgDb = org.Hs.eg.db, ont = "BP", pvalueCutoff  = 0.01,
                                qvalueCutoff  = 0.05, 
                                pAdjustMethod = "BH", readable = T)
got_cor[["cor_hr"]] = getTopTerms(got@result[got@result$p.adjust<=0.05,], ncl = 4, nt = 2, topt = 1000)

saveRDS(got_cor, file = "results/endothelial/GOTerms_correlations.RDS")

Save Seurat with predictions

topgenes = unique(c(names(end_cor_he[order(end_cor_he, decreasing = T)])[1:30],
             names(end_cor_hr[order(end_cor_hr, decreasing = T)])[1:30]))
bottomgenes = unique(c(names(end_cor_he[order(end_cor_he, decreasing = F)])[1:30],
             names(end_cor_hr[order(end_cor_hr, decreasing = F)])[1:30]))
usegenes = c(topgenes, bottomgenes)

bins_list = list()
for(n in names(only_end_cells_split)){
  plot_df = cbind(data.frame("pt" = rep(1:10, each = 10)),end_fits_qval[[n]]$fits[,usegenes])
  plot_df$bins10 = cut(plot_df$pt, 10)
  bins_list[[n]] = sapply(usegenes, function(x) scale(tapply(plot_df[,x], plot_df$bins10, mean))[10:1])
}
bins_mean = Reduce(rbind, bins_list)

hct = hclust(dist(t(bins_list$healthy[,topgenes])), method = "ward.D2")
ord_bot_h = apply(bins_list$healthy[,bottomgenes], 2, which.max)
ord_bot_e = apply(bins_list$embolised[,bottomgenes], 2, which.max)
ord_bot_r = apply(bins_list$regenerating[,bottomgenes], 2, which.max)
ord_df = data.frame(ord_bot_h, ord_bot_e, ord_bot_r)
ord_bot = rownames(ord_df)[with(ord_df, order(ord_bot_h, ord_bot_e, ord_bot_r, decreasing = T))]
ord = c(topgenes[hct$order], ord_bot)

pheatmap::pheatmap(bins_mean[,ord], show_rownames = F, fontsize_col = 6.5, border_color = NA,
                   gaps_row = c(10,20), gaps_col = c(length(topgenes)),
                   clustering_method = "ward.D2", cluster_rows = F, cluster_cols = F)

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCgojIEdlbmVyYWwgU2V0dXAKU2V0dXAgY2h1bmsKCmBgYHtyLCBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy53aWR0aCA9IDgpCmtuaXRyOjpvcHRzX2tuaXQkc2V0KHJvb3QuZGlyID0gbm9ybWFsaXplUGF0aCgiLi4iKSkKa25pdHI6Om9wdHNfa25pdCRnZXQoInJvb3QuZGlyIikKYGBgCgpTZXR1cCByZXRpY3VsYXRlCgpgYGB7cn0KbGlicmFyeShyZXRpY3VsYXRlKQprbml0cjo6a25pdF9lbmdpbmVzJHNldChweXRob24gPSByZXRpY3VsYXRlOjplbmdfcHl0aG9uKQpweV9hdmFpbGFibGUoaW5pdGlhbGl6ZSA9IEZBTFNFKQp1c2VfcHl0aG9uKFN5cy53aGljaCgicHl0aG9uIikpCnB5X2NvbmZpZygpCmBgYAoKTG9hZCBsaWJyYXJpZXMKCmBgYHtyfQpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRlc3RpbnkpCmxpYnJhcnkocGx5cikKbGlicmFyeShkcGx5cikKbGlicmFyeShSQ29sb3JCcmV3ZXIpCmBgYAoKRnVuY3Rpb25zCgpgYGB7cn0KZ2V0RFBUID0gZnVuY3Rpb24oeCl7CiAgcmV0dXJuKGRlc3Rpbnk6OjpkcHRfZm9yX2JyYW5jaChkZXN0aW55OjpicmFuY2hfZGl2aWRlKHgsIGludGVnZXIoMEwpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oZGVzdGlueTo6YnJhbmNoX2RpdmlkZSh4LCBpbnRlZ2VyKDBMKSlAYnJhbmNoWywgMV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkpKQp9CkNWZ2FtID0gZnVuY3Rpb24gKGZvcm11bGEsIGRhdGEsIG5mb2xkID0gMTAsIGRlYnVnLmxldmVsID0gMCwgbWV0aG9kID0gImdsbS5maXQiLCAKICAgIHByaW50aXQgPSBUUlVFLCBjdnBhcnRzID0gTlVMTCwgc2VlZCA9IDI5KXsKICAjIG1vZGlmaWVkIGZyb20gdGhlIGBnYW1jbGFzc2AgcGFja2FnZSB0byB1c2UgZ2FtOjpnYW0KICAgIGlmIChpcy5udWxsKGN2cGFydHMpKSB7CiAgICAgICAgc2V0LnNlZWQoc2VlZCkKICAgICAgICBjdnBhcnRzIDwtIHNhbXBsZSgxOm5mb2xkLCBucm93KGRhdGEpLCByZXBsYWNlID0gVFJVRSkKICAgIH0KICAgIGZvbGRzIDwtIHVuaXF1ZShjdnBhcnRzKQogICAga2hhdCA8LSBoYXQgPC0gbnVtZXJpYyhucm93KGRhdGEpKQogICAgc2NhbGUuZ2FtIDwtIHN1bW1hcnkoZ2FtOjpnYW0oZm9ybXVsYSwgZGF0YSA9IGRhdGEsIG1ldGhvZCA9IG1ldGhvZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseSA9IG1nY3Y6OmJldGFyKGxpbmsgPSAibG9naXQiLCBlcHMgPSAwLjAwMDAxKSkpJHNjYWxlCiAgICBmb3IgKGkgaW4gZm9sZHMpIHsKICAgICAgICB0cmFpbnJvd3MgPC0gY3ZwYXJ0cyAhPSBpCiAgICAgICAgdGVzdHJvd3MgPC0gY3ZwYXJ0cyA9PSBpCiAgICAgICAgZWxldi5nYW0gPC0gZ2FtOjpnYW0oZm9ybXVsYSwgZGF0YSA9IGRhdGFbdHJhaW5yb3dzLCBdLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSBtZXRob2QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseSA9IG1nY3Y6OmJldGFyKGxpbmsgPSAibG9naXQiLCBlcHMgPSAwLjAwMDAxKSkKICAgICAgICBoYXRbdGVzdHJvd3NdIDwtIHByZWRpY3QoZWxldi5nYW0sIG5ld2RhdGEgPSBkYXRhW3Rlc3Ryb3dzLF0sIHNlbGVjdCA9IFQsIHR5cGUgPSAicmVzcG9uc2UiKQogICAgICAgIHJlcyA8LSByZXNpZHVhbHMoZWxldi5nYW0pCiAgICB9CiAgICB5IDwtIGV2YWwoZm9ybXVsYVtbMl1dLCBlbnZpciA9IGFzLmRhdGEuZnJhbWUoZGF0YSkpCiAgICByZXMgPC0geSAtIGhhdAogICAgY3ZzY2FsZSA8LSBzdW0ocmVzXjIpL2xlbmd0aChyZXMpCiAgICBwcm50dmVjIDwtIGMoR0FNc2NhbGUgPSBzY2FsZS5nYW0sIGBDVi1tc2UtR0FNIGAgPSBjdnNjYWxlKQogICAgaWYgKHByaW50aXQpIAogICAgICAgIHByaW50KHJvdW5kKHBybnR2ZWMsIDQpKQogICAgaW52aXNpYmxlKGxpc3QoZml0dGVkID0gaGF0LCByZXNpZCA9IHJlcywgY3ZzY2FsZSA9IGN2c2NhbGUsIAogICAgICAgIHNjYWxlLmdhbSA9IHNjYWxlLmdhbSkpCn0KZml0dGluZ0Z1bmMgPSBmdW5jdGlvbihnKXsKICB0ID0gc3ViX2RhdCR6b25hdGlvbl9wdAogIGdlbmVfZml0X3AgPSBjKCkKICBnZW5lX2ZpdF92YWxzID0gZGF0YS5mcmFtZShyb3cubmFtZXMgPSAxOjEwMCkKICB6ID0gc3ViX2RhdEBhc3NheXMkU0NUQGRhdGFbZyxdCiAgICAKICBkID0gZGF0YS5mcmFtZSh6PXosIHQ9dCkKICB0bXAgPSBzdXBwcmVzc01lc3NhZ2VzKGdhbSh6IH4gbnModCwgZGYgPSAzKSwgZGF0YT1kKSkKICAKICAjIGJpbnMgZm9yIG1vZGVsIGZpdHRpbmcKICBiYiA9IHNlcShtaW4odCksIG1heCh0KSwgbGVuZ3RoLm91dCA9IDEwMCkKICBnZW5lX2ZpdF92YWxzWyxnXSA9IHN1cHByZXNzTWVzc2FnZXMocHJlZGljdCh0bXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3ZGF0YSA9IGRhdGEuZnJhbWUodCA9IGJiKSkpCiAgcCA9IHN1bW1hcnkodG1wKSRwYXJhbWV0cmljLmFub3ZhJGBQcig+RilgWzFdCiAgZ2VuZV9maXRfcCA9IGMoZ2VuZV9maXRfcCwgcCkKICBuYW1lcyhnZW5lX2ZpdF9wKVtsZW5ndGgoZ2VuZV9maXRfcCldID0gZwogIAogIHJldHVybihsaXN0KCJmaXRzIiA9IGdlbmVfZml0X3ZhbHMsICJwdmFsIiA9IGdlbmVfZml0X3ApKQp9Cm1pbm1heF9zY2FsZSA9IGZ1bmN0aW9uKHgpewogIHJldHVybigoeC1taW4oeCkpLyhtYXgoeCktbWluKHgpKSkKfQpnZXRUb3BUZXJtcyA9IGZ1bmN0aW9uKGdvZGYsIHRvcHQgPSAxMDAsIG5jbCA9IDUsIG50ID0gMil7CiAgdG9wdCA9IGlmKG5yb3coZ29kZik8dG9wdCkgbnJvdyhnb2RmKSBlbHNlIHRvcHQKICBpZihucm93KGdvZGYpPG5jbCkgcmV0dXJuKGdvZGYpCiAgZGYgPSBnb2RmWzE6dG9wdCxdCiAgZ2VuZXMgPSBzYXBwbHkoZGYkZ2VuZUlELCBmdW5jdGlvbih4KSBzdHJzcGxpdCh4LCAiLyIpKQogIHJlc21hdCA9IG1hdHJpeCgwLCBsZW5ndGgoZ2VuZXMpLCBsZW5ndGgoZ2VuZXMpKQogIGZvcihpIGluIDE6bGVuZ3RoKGdlbmVzKSl7CiAgICBmb3IoaiBpbiAxOmxlbmd0aChnZW5lcykpewogICAgICByZXNtYXRbaSxqXSA9IGxlbmd0aChpbnRlcnNlY3QoZ2VuZXNbW2ldXSwgZ2VuZXNbW2pdXSkpL2xlbmd0aChnZW5lc1tbaV1dKQogICAgfQogIH0KICBjbCA9IGhjbHVzdChkaXN0KHJlc21hdCksIG1ldGhvZCA9ICJ3YXJkLkQyIikKICBjbCA9IGN1dHJlZShjbCwgbmNsKQogIHJlc19kZiA9IGRhdGEuZnJhbWUoIkRlc2NyaXB0aW9uIiA9IGRmJERlc2NyaXB0aW9uLCAicXZhbHVlIiA9IGRmJHF2YWx1ZSwgImdlbmVJRCIgPSBkZiRnZW5lSUQsIAogICAgICAgICAgICAgICAgICAgICAgY2wsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGKQogIHJlc19kZiA9IHJlc19kZltvcmRlcihyZXNfZGYkcXZhbHVlLCBkZWNyZWFzaW5nID0gRiksXQogIHRvcHRlcm1zID0gdW5saXN0KHRhcHBseShyZXNfZGYkRGVzY3JpcHRpb24sIHJlc19kZiRjbCwgZnVuY3Rpb24oeCkgeFsxOm50XSkpCiAgcmVzX2RmID0gcmVzX2RmW3Jlc19kZiREZXNjcmlwdGlvbiAlaW4lIHRvcHRlcm1zLF0KICAKICByZXR1cm4ocmVzX2RmKQp9CmBgYAoKTG9hZCBkYXRhIChmcm9tIGFsbCBjZWxscykKCmBgYHtyfQphbGxjZWxsc19jc3MgPSByZWFkUkRTKGZpbGUgPSAiZGF0YS9wcm9jZXNzZWQvYWxsY2VsbHNfY3NzLlJEUyIpCmBgYAoKCgojIEVuZG90aGVsaWFsIGNlbGwgY2x1c3RlcmluZwpTdWJzZXQgTFNFQwoKYGBge3J9CmFsbF9lbmRfY2VsbHMgPSBhbGxjZWxsc19jc3NbLGdyZXBsKCJMU0VDIiwgYWxsY2VsbHNfY3NzQG1ldGEuZGF0YSRhbGxjZWxsc19jbHVzdGVycyldCmFsbF9lbmRfY2VsbHMgPSBzdXBwcmVzc1dhcm5pbmdzKFNDVHJhbnNmb3JtKGFsbF9lbmRfY2VsbHMsIGRvLmNvcnJlY3QudW1pID0gVCwgdmVyYm9zZSA9IEYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJzLnRvLnJlZ3Jlc3M9YygidW5pcXVlX25hbWUiLCJuQ291bnRfUk5BIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmZlYXR1cmVzLnJ2LnRoID0gMSwgc2VlZC51c2UgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ub25seS52YXIuZ2VuZXMgPSBGLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuZmVhdHVyZXMubiA9IE5VTEwpKQphbGxfZW5kX2NlbGxzID0gUnVuUENBKGFsbF9lbmRfY2VsbHMsIHZlcmJvc2UgPSBGKQphbGxfZW5kX2NlbGxzID0gUnVuVU1BUChhbGxfZW5kX2NlbGxzLCBkaW1zID0gMToyNSwgdmVyYm9zZSA9IEYpCkRpbVBsb3QoYWxsX2VuZF9jZWxscywgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJDb25kaXRpb24iKQpEaW1QbG90KGFsbF9lbmRfY2VsbHMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAiYWxsY2VsbHNfc2ltcCIpCkRpbVBsb3QoYWxsX2VuZF9jZWxscywgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJEb25vciIpCkRpbVBsb3QoYWxsX2VuZF9jZWxscywgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJQaGFzZSIpCkZlYXR1cmVQbG90KGFsbF9lbmRfY2VsbHMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZmVhdHVyZXMgPSBjKCJNS0k2NyIsICJBTEIiLCAiUzEwMEE4IiwgIkNPTEVDMTEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0xFQzFCIiwgIkNMRUMxNEEiLCAiQVFQMSIsICJNR1AiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxZVkUxIiwgIlBST1gxIiwgIkNEMTQiLCAiUEVDQU0xIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZXRiIsICJJTk1UIiwgIlBMVkFQIiwgIlJCUDciKSkKYGBgCgpDbHVzdGVyIGFuZCBnZXQgbWFya2VycwoKYGBge3J9CmFsbF9lbmRfY2VsbHMgPSBGaW5kTmVpZ2hib3JzKGFsbF9lbmRfY2VsbHMsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMToyNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJ1bmUuU05OID0gMS81LCBmb3JjZS5yZWNhbGMgPSBULCBncmFwaC5uYW1lID0gInBjYTI1IikKYWxsX2VuZF9jZWxscyA9IEZpbmRDbHVzdGVycyhhbGxfZW5kX2NlbGxzLCBhbGdvcml0aG0gPSAyLCB2ZXJib3NlID0gRiwgZ3JhcGgubmFtZSA9ICJwY2EyNSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiA9IHNlcSgwLjEsIDIsIDAuMSkpCkRpbVBsb3QoYWxsX2VuZF9jZWxscywgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJwY2EyNV9yZXMuMSIsIGxhYmVsID0gVCkKRGltUGxvdChhbGxfZW5kX2NlbGxzLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gIkRvbm9yIiwgbGFiZWwgPSBGKQpEaW1QbG90KGFsbF9lbmRfY2VsbHMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAiQ29uZGl0aW9uIiwgbGFiZWwgPSBGKQoKYWxsX2VuZF9jZWxscyA9IFNldElkZW50KGFsbF9lbmRfY2VsbHMsIHZhbHVlID0gInBjYTI1X3Jlcy4xIikKbWtlbmQgPSBGaW5kQWxsTWFya2VycyhhbGxfZW5kX2NlbGxzLCBsb2dmYy50aHJlc2hvbGQgPSAwLjIsIHBzZXVkb2NvdW50LnVzZSA9IDAuMSkKd3JpdGUuY3N2KG1rZW5kW21rZW5kJHBfdmFsX2Fkajw9MC4wNSxdLCAKICAgICAgICAgIGZpbGUgPSAicmVzdWx0cy9lbmRvdGhlbGlhbC9tYXJrZXJzX2VuZG9fc3VicG9wX2FsbC5jc3YiLCByb3cubmFtZXMgPSBULCBxdW90ZSA9IEYpCgpzYXZlUkRTKG1rZW5kLCBmaWxlID0gIi4vcmVzdWx0cy9lbmRvdGhlbGlhbC9jbHVzdF9tYXJrZXJzX2VuZG8uUkRTIikKYGBgCgpBbm5vdGF0ZSB0aGUgY2x1c3RlcnMKCmBgYHtyfQphbm5vdCA9IGMoIjAiID0gIlBlcmlwb3J0YWwgTFNFQyIsCiIxIiA9ICJMU0VDIChzdHJlc3MpIiwKIjIiID0gIkVDIG5vbi1MU0VDIiwKIjMiID0gIlBlcmljZW50cmFsIExTRUMiLAoiNCIgPSAiUGVyaXBvcnRhbCBMU0VDIiwKIjUiID0gIlBlcmljZW50cmFsIExTRUMiLAoiNiIgPSAiTFNFQyAocmVtb2RlbGxpbmcpIiwKIjciID0gIkxTRUMgKGhpZ2ggTVQgMSkiLAoiOCIgPSAiTFNFQyAoaW50ZXJmZXJvbikiLAoiOSIgPSAiQiBjZWxsL0hlcGF0b2N5dGUvRUMgZG91YmxldHMiLAoiMTAiID0gIkxTRUMgKGhpZ2ggTVQgMikiLAoiMTEiID0gIlVua25vd25fRDNfZW1iIiwKIjEyIiA9ICJVbmtub3duX0QzX3JlZ2VuIiwKIjEzIiA9ICJMU0VDIChmZW5lc3RyLikiLAoiMTQiID0gIkhlcGF0b2N5dGVzIiwKIjE1IiA9ICJMeW1waGF0aWMgRUMiLAoiMTYiID0gIkN5Y2xpbmcgY2VsbHMiLAoiMTciID0gIlN0ZWxsYXRlIGNlbGxzIikKCmNsbmFtZXMgPSBkYXRhLmZyYW1lKCJlbmRvX2Fubm90IiA9IGFsbF9lbmRfY2VsbHNAbWV0YS5kYXRhJHBjYTI1X3Jlcy4xKQpyb3duYW1lcyhjbG5hbWVzKSA9IGNvbG5hbWVzKGFsbF9lbmRfY2VsbHMpCmNsbmFtZXMkZW5kb19zcGVjID0gcGx5cjo6cmV2YWx1ZShjbG5hbWVzJGVuZG9fYW5ub3QsIGFubm90KQpjbG5hbWVzJGVuZG9fc2ltcCA9IGFzLmNoYXJhY3RlcihjbG5hbWVzJGVuZG9fc3BlYykKY2xuYW1lcyRlbmRvX3NpbXBbY2xuYW1lcyRlbmRvX2Fubm90ICVpbiUgYyg5LCAxMSwgMTIsIDE0LCAxNyldID0gIk90aGVyL3Vua25vd24iCgphbGxfZW5kX2NlbGxzID0gQWRkTWV0YURhdGEoYWxsX2VuZF9jZWxscywgbWV0YWRhdGEgPSBjbG5hbWVzKQpEaW1QbG90KGFsbF9lbmRfY2VsbHMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAiZW5kb19zaW1wIiwgbGFiZWwgPSBGKQoKc2F2ZVJEUyhhbGxfZW5kX2NlbGxzLCBmaWxlID0gIi4vcmVzdWx0cy9lbmRvdGhlbGlhbC9hbGxfZW5kX2NlbGxzLlJEUyIpCmBgYAoKUmVkbyBhbGwgdy9vIGNvbnRhbWluYXRpbmcgY2VsbHMgKG9ubHkgRUNzIG9mIGFueSB0eXBlKQoKYGBge3J9Cm9ubHlfZW5kX2NlbGxzID0gYWxsX2VuZF9jZWxsc1ssIWdyZXBsKCJPdGhlci91bmtub3duIiwgYWxsX2VuZF9jZWxsc0BtZXRhLmRhdGEkZW5kb19zaW1wKV0Kb25seV9lbmRfY2VsbHMgPSBzdXBwcmVzc1dhcm5pbmdzKFNDVHJhbnNmb3JtKG9ubHlfZW5kX2NlbGxzLCBkby5jb3JyZWN0LnVtaSA9IFQsIHZlcmJvc2UgPSBGLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFycy50by5yZWdyZXNzPWMoInVuaXF1ZV9uYW1lIiwibkNvdW50X1JOQSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5mZWF0dXJlcy5ydi50aCA9IDEsIHNlZWQudXNlID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLm9ubHkudmFyLmdlbmVzID0gRiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmZlYXR1cmVzLm4gPSBOVUxMKSkKb25seV9lbmRfY2VsbHMgPSBSdW5QQ0Eob25seV9lbmRfY2VsbHMsIHZlcmJvc2UgPSBGKQpvbmx5X2VuZF9jZWxscyA9IFJ1blVNQVAob25seV9lbmRfY2VsbHMsIGRpbXMgPSAxOjI1LCB2ZXJib3NlID0gRikKCm9ubHlfZW5kX2NlbGxzID0gRmluZE5laWdoYm9ycyhvbmx5X2VuZF9jZWxscywgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjI1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcnVuZS5TTk4gPSAxLzUsIGZvcmNlLnJlY2FsYyA9IFQsIGdyYXBoLm5hbWUgPSAicGNhMjUiKQpvbmx5X2VuZF9jZWxscyA9IEZpbmRDbHVzdGVycyhvbmx5X2VuZF9jZWxscywgYWxnb3JpdGhtID0gMiwgdmVyYm9zZSA9IEYsIGdyYXBoLm5hbWUgPSAicGNhMjUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24gPSBzZXEoMC4xLCAyLCAwLjEpKQpEaW1QbG90KG9ubHlfZW5kX2NlbGxzLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gInBjYTI1X3Jlcy4wLjkiLCBsYWJlbCA9IFQpCkRpbVBsb3Qob25seV9lbmRfY2VsbHMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAiZW5kb19zaW1wIiwgbGFiZWwgPSBUKQpEaW1QbG90KG9ubHlfZW5kX2NlbGxzLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gIkRvbm9yIiwgbGFiZWwgPSBGKQpEaW1QbG90KG9ubHlfZW5kX2NlbGxzLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gIkNvbmRpdGlvbiIsIGxhYmVsID0gRikKYGBgCgpNYXJrZXJzIGZvciBmaWx0ZXJlZCBjbHVzdGVycwoKYGBge3J9Cm9ubHlfZW5kX2NlbGxzID0gU2V0SWRlbnQob25seV9lbmRfY2VsbHMsIHZhbHVlID0gInBjYTI1X3Jlcy4wLjkiKQpta2VuZCA9IEZpbmRBbGxNYXJrZXJzKG9ubHlfZW5kX2NlbGxzLCBsb2dmYy50aHJlc2hvbGQgPSAwLjIsIHBzZXVkb2NvdW50LnVzZSA9IDAuMSkKd3JpdGUuY3N2KG1rZW5kW21rZW5kJHBfdmFsX2Fkajw9MC4wNSxdLCAKICAgICAgICAgIGZpbGUgPSAicmVzdWx0cy9lbmRvdGhlbGlhbC9tYXJrZXJzX2VuZG9fc3VicG9wX29ubHkuY3N2Iiwgcm93Lm5hbWVzID0gVCwgcXVvdGUgPSBGKQpzYXZlUkRTKG1rZW5kLCBmaWxlID0gIi4vcmVzdWx0cy9lbmRvdGhlbGlhbC9jbHVzdF9tYXJrZXJzX2VuZG9fb25seS5SRFMiKQpgYGAKCkFubm90YXRlIHRoZSBjbHVzdGVycyBmb3IgRUNzIG9ubHkKCmBgYHtyfQphbm5vdCA9IGMoIjAiID0gIk1pZHpvbmFsIExTRUMiLAoiMSIgPSAiUGVyaWNlbnRyYWwgTFNFQyIsCiIyIiA9ICJMU0VDIChzdHJlc3MpIiwKIjMiID0gIlBlcmlwb3J0YWwgTFNFQyIsCiI0IiA9ICJFQyBub24tTFNFQyIsCiI1IiA9ICJMU0VDIChpbnRlcmZlcm9uKSIsCiI2IiA9ICJMU0VDIChyZW1vZGVsbGluZykiLAoiNyIgPSAiTFNFQyAoaGlnaCBNVCAxKSIsCiI4IiA9ICJMU0VDIChoaWdoIE1UIDIpIiwKIjkiID0gIkxTRUMgKGZlbmVzdHIuKSIsCiIxMCIgPSAiTHltcGhhdGljIEVDIiwKIjExIiA9ICJDeWNsaW5nIGNlbGxzIiwKIjEyIiA9ICJQZXJpcG9ydGFsIExTRUMiKQoKY2xuYW1lcyA9IGRhdGEuZnJhbWUoImVuZG9Pbmx5X2Fubm90IiA9IG9ubHlfZW5kX2NlbGxzQG1ldGEuZGF0YSRwY2EyNV9yZXMuMC45KQpyb3duYW1lcyhjbG5hbWVzKSA9IGNvbG5hbWVzKG9ubHlfZW5kX2NlbGxzKQpjbG5hbWVzJGVuZG9fc3BlYyA9IHBseXI6OnJldmFsdWUoY2xuYW1lcyRlbmRvT25seV9hbm5vdCwgYW5ub3QpCmNsbmFtZXMkZW5kb19zaW1wID0gYXMuY2hhcmFjdGVyKGNsbmFtZXMkZW5kb19zcGVjKQoKb25seV9lbmRfY2VsbHMgPSBBZGRNZXRhRGF0YShvbmx5X2VuZF9jZWxscywgbWV0YWRhdGEgPSBjbG5hbWVzKQpEaW1QbG90KG9ubHlfZW5kX2NlbGxzLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gImVuZG9fc2ltcCIsIGxhYmVsID0gRikKCnNhdmVSRFMob25seV9lbmRfY2VsbHMsIGZpbGUgPSAiLi9yZXN1bHRzL2VuZG90aGVsaWFsL29ubHlfZW5kX2NlbGxzLlJEUyIpCmBgYAoKR2V0IGNvbmRpdGlvbiBtYXJrZXJzIGZvciBlYWNoIGNsdXN0ZXIKCmBgYHtyfQpvbmx5X2VuZF9jZWxscyA9IFNldElkZW50KG9ubHlfZW5kX2NlbGxzLCB2YWx1ZSA9ICJDb25kaXRpb24iKQpta19lbmRvX2xpc3QgPSBsaXN0KCkKZm9yKGN0IGluIHVuaXF1ZShvbmx5X2VuZF9jZWxscyRlbmRvX3NpbXApKXsKICBta19lbmRvX2xpc3RbW2N0XV0gPSBGaW5kQWxsTWFya2Vycyhvbmx5X2VuZF9jZWxsc1ssb25seV9lbmRfY2VsbHMkZW5kb19zaW1wPT1jdF0sIGFzc2F5ID0gIlNDVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNldWRvY291bnQudXNlID0gMC4xLCBsb2dmYy50aHJlc2hvbGQgPSAwLjIpCiAgbWtfZW5kb19saXN0W1tjdF1dID0gbWtfZW5kb19saXN0W1tjdF1dW21rX2VuZG9fbGlzdFtbY3RdXSRwX3ZhbF9hZGo8PTAuMDUsXQp9CnNhdmVSRFMobWtfZW5kb19saXN0LCBmaWxlID0gIi4vcmVzdWx0cy9lbmRvdGhlbGlhbC9jb25kX21hcmtlcnNfZW5kby5SRFMiKQpgYGAKClBsb3QgYWJ1bmRhbmNlIG9mIGNsdXN0ZXJzIHBlciBjb25kaXRpb24KCmBgYHtyLCBmaWcud2lkdGg9NH0KZGZfY250ID0gdGFibGUob25seV9lbmRfY2VsbHMkZW5kb19zaW1wLCBvbmx5X2VuZF9jZWxscyRDb25kaXRpb24pCmRmX2NudF9wZXJDb25kID0gcmVzaGFwZTI6Om1lbHQoYXBwbHkoZGZfY250LCAyLCBmdW5jdGlvbih4KSByb3VuZCh4L3N1bSh4KSoxMDAsIDEpKSkKZGZfY250X3BlckNsID0gcmVzaGFwZTI6Om1lbHQoYXBwbHkoZGZfY250LCAxLCBmdW5jdGlvbih4KSByb3VuZCh4L3N1bSh4KSoxMDAsIDEpKSkKCm1hdF9jbnRfYWxsID0gcmVzaGFwZTI6OmRjYXN0KGRhdGEgPSBkZl9jbnRfcGVyQ29uZCwgZm9ybXVsYSA9IFZhcjEgfiBWYXIyLCB2YWx1ZS52YXIgPSAidmFsdWUiKQpyb3duYW1lcyhtYXRfY250X2FsbCkgPSBtYXRfY250X2FsbCRWYXIxCm1hdF9jbnRfYWxsID0gbWF0X2NudF9hbGxbLC0xXQpjdG9yZCA9IGhjbHVzdChkaXN0KG1hdF9jbnRfYWxsWyxjKDIsMSwzKV0pKSRvcmRlcgoKaGVhdHAgPSBwaGVhdG1hcDo6cGhlYXRtYXAobWF0X2NudF9hbGxbY3RvcmQsYygyLDEsMyldLCBjbHVzdGVyX2NvbHMgPSBGLCBjbHVzdGVyX3Jvd3MgPSBGLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZWhlaWdodF9yb3cgPSBGLCBkaXNwbGF5X251bWJlcnMgPSBULCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX2NvbG9yID0gYygiYmxhY2siLCJ3aGl0ZSIpW2FzLmludGVnZXIobWF0X2NudF9hbGxbY3RvcmQsYygyLDEsMyldPjI1KSsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBjb2xvclJhbXBQYWxldHRlKGJyZXdlci5wYWwobiA9IDksIG5hbWUgPSAiQmx1ZXMiKSkoMTAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udHNpemVfcm93ID0gOCwgZm9udHNpemVfY29sID0gOCwgYW5nbGVfY29sID0gMCkKCm1hdF9jbnRfYWxsID0gcmVzaGFwZTI6OmRjYXN0KGRhdGEgPSBkZl9jbnRfcGVyQ2wsIGZvcm11bGEgPSBWYXIxIH4gVmFyMiwgdmFsdWUudmFyID0gInZhbHVlIikKcm93bmFtZXMobWF0X2NudF9hbGwpID0gbWF0X2NudF9hbGwkVmFyMQptYXRfY250X2FsbCA9IHQobWF0X2NudF9hbGxbLC0xXSkKY3RvcmQgPSBoY2x1c3QoZGlzdChtYXRfY250X2FsbFssYygyLDEsMyldKSkkb3JkZXIKCmhlYXRwID0gcGhlYXRtYXA6OnBoZWF0bWFwKG1hdF9jbnRfYWxsW2N0b3JkLGMoMiwxLDMpXSwgY2x1c3Rlcl9jb2xzID0gRiwgY2x1c3Rlcl9yb3dzID0gRiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVoZWlnaHRfcm93ID0gRiwgZGlzcGxheV9udW1iZXJzID0gVCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9jb2xvciA9IGMoImJsYWNrIiwgIndoaXRlIilbYXMuaW50ZWdlcihtYXRfY250X2FsbFtjdG9yZCxjKDIsMSwzKV0+NTApKzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGNvbG9yUmFtcFBhbGV0dGUoYnJld2VyLnBhbChuID0gOSwgbmFtZSA9ICJCbHVlcyIpKSgxMDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb250c2l6ZV9yb3cgPSA4LCBmb250c2l6ZV9jb2wgPSA4LCBhbmdsZV9jb2wgPSAwKQoKb25seV9lbmRfY2VsbHMgPSBTZXRJZGVudChvbmx5X2VuZF9jZWxscywgdmFsdWUgPSAiZW5kb19zaW1wIikKbWtlbmRfc2ltcCA9IEZpbmRBbGxNYXJrZXJzKG9ubHlfZW5kX2NlbGxzLCBsb2dmYy50aHJlc2hvbGQgPSAwLjIsIHBzZXVkb2NvdW50LnVzZSA9IDAuMSkKd3JpdGUuY3N2KG1rZW5kX3NpbXBbbWtlbmRfc2ltcCRwX3ZhbF9hZGo8PTAuMDUsXSwgCiAgICAgICAgICBmaWxlID0gInJlc3VsdHMvZW5kb3RoZWxpYWwvbWFya2Vyc19lbmRvX3N1YnBvcF9zaW1wLmNzdiIsIHJvdy5uYW1lcyA9IFQsIHF1b3RlID0gRikKYGBgCgoKCiMgRW5kb3RoZWxpYWwgem9uYXRpb24KTWFrZSBkaWZmZXJlbnQgc3Vic2V0cyB0byB0ZXN0CgpgYGB7cn0KbHNlY19saXN0ID0gbGlzdChsc2VjX2VuZF9jZWxscyA9IG9ubHlfZW5kX2NlbGxzWyxvbmx5X2VuZF9jZWxscyRwY2EyNV9yZXMuMC45ICVpbiUgYygwLCAxLCAzLCAxMildKQpgYGAKCk5vcm1hbGlzZSwgUENBLCBVTUFQCgpgYGB7cn0KaF9sc2VjX2xpc3QgPSBsaXN0KCkKZm9yKG4gaW4gbmFtZXMobHNlY19saXN0KSl7CiAgaF9sc2VjX2xpc3RbW25dXSA9IGxzZWNfbGlzdFtbbl1dWyxsc2VjX2xpc3RbW25dXSRDb25kaXRpb249PSJoZWFsdGh5Il0KICBoX2xzZWNfbGlzdFtbbl1dID0gc3VwcHJlc3NXYXJuaW5ncyhTQ1RyYW5zZm9ybShoX2xzZWNfbGlzdFtbbl1dLCBkby5jb3JyZWN0LnVtaSA9IFQsIHZlcmJvc2UgPSBGLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJzLnRvLnJlZ3Jlc3M9YygidW5pcXVlX25hbWUiLCJuQ291bnRfUk5BIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuZmVhdHVyZXMucnYudGggPSAxLCBzZWVkLnVzZSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLm9ubHkudmFyLmdlbmVzID0gRiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuZmVhdHVyZXMubiA9IE5VTEwpKQogIGhfbHNlY19saXN0W1tuXV0gPSBSdW5QQ0EoaF9sc2VjX2xpc3RbW25dXSwgdmVyYm9zZSA9IEYpCiAgaF9sc2VjX2xpc3RbW25dXSA9IFJ1blVNQVAoaF9sc2VjX2xpc3RbW25dXSwgZGltcyA9IDE6MjAsIHZlcmJvc2UgPSBGKQp9CmBgYAoKR2V0IERQVAoKYGBge3J9CmRwdF9sID0gbGlzdCgpCmZvcihuIGluIG5hbWVzKGhfbHNlY19saXN0KSl7CiAgc2V0LnNlZWQoMSkKICBkbSA9IERpZmZ1c2lvbk1hcChoX2xzZWNfbGlzdFtbbl1dQHJlZHVjdGlvbnMkcGNhQGNlbGwuZW1iZWRkaW5nc1ssMToxMF0sIAogICAgICAgICAgICAgICAgICAgIHJvdGF0ZSA9IFQsIG5fZWlncyA9IDUpCiAgZHB0ID0gRFBUKGRtKQogIHBsb3QoZHB0LCBtYWluID0gbikKICBkcHRfbFtbbl1dID0gZHB0Cn0KYGBgCgpQbG90IERQVCBhcyB2aW9saW4KCmBgYHtyfQpmb3IobiBpbiBuYW1lcyhoX2xzZWNfbGlzdCkpewogIHBsb3RfZGYgPSBkYXRhLmZyYW1lKHJvdy5uYW1lcyA9IHJvd25hbWVzKGRwdF9sW1tuXV1AYnJhbmNoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgImNsIiA9IGhfbHNlY19saXN0W1tuXV0kZW5kb19zaW1wLAogICAgICAgICAgICAgICAgICAgICAgICJkcHQiID0gZ2V0RFBUKGRwdF9sW1tuXV0pKQogIAogIHBsdCA9IGdncGxvdChwbG90X2RmLCBhZXMoeSA9IGNsLCB4ID0gZHB0LCBmaWxsID0gY2wpKSsKICAgIGdlb21fYm94cGxvdCgpKwogICAgbGFicyh0aXRsZSA9IG4pKwogICAgdGhlbWVfYncoKSsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LjUpKQogIHByaW50KHBsdCkKfQpgYGAKCldlJ3JlIHVzaW5nIHN1YnNldCAyIC0gb25seSBib25hIGZpZGUgTFNFQwoKYGBge3J9CiMgZmlsdGVyIHNvbWUgb3V0bGllciBjZWxscyBhbmQgcmVwcm9jZXNzCmNvbmQgPSBkcHRfbCRsc2VjX2VuZF9jZWxsc0BkbSREQzE8KDAuMSkKc3ViXzIgPSBoX2xzZWNfbGlzdCRsc2VjX2VuZF9jZWxsc1ssY29uZF0Kc3ViXzIgPSBzdXBwcmVzc1dhcm5pbmdzKFNDVHJhbnNmb3JtKHN1Yl8yLCBkby5jb3JyZWN0LnVtaSA9IFQsIHZlcmJvc2UgPSBGLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcnMudG8ucmVncmVzcz1jKCJ1bmlxdWVfbmFtZSIsIm5Db3VudF9STkEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmZlYXR1cmVzLnJ2LnRoID0gMSwgc2VlZC51c2UgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLm9ubHkudmFyLmdlbmVzID0gRiwgdmFyaWFibGUuZmVhdHVyZXMubiA9IE5VTEwpKQpzdWJfMiA9IFJ1blBDQShzdWJfMiwgdmVyYm9zZSA9IEYpCnN1Yl8yID0gUnVuVU1BUChzdWJfMiwgZGltcyA9IDE6MjAsIHZlcmJvc2UgPSBGKQpEaW1QbG90KHN1Yl8yLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gImVuZG9fc2ltcCIpCgpzZXQuc2VlZCgxKQpkbSA9IERpZmZ1c2lvbk1hcChzdWJfMkByZWR1Y3Rpb25zJHBjYUBjZWxsLmVtYmVkZGluZ3NbLDE6MTBdLCAKICAgICAgICAgICAgICAgICAgcm90YXRlID0gVCwgbl9laWdzID0gMikKZHB0ID0gRFBUKGRtKQpwbG90KGRwdCkKYGBgCgpQbG90IHBzZXVkb3RpbWUgYXMgYm94cGxvdAoKYGBge3J9CnBsb3RfZGYgPSBkYXRhLmZyYW1lKHJvdy5uYW1lcyA9IHJvd25hbWVzKGRwdEBicmFuY2gpLCAKICAgICAgICAgICAgICAgICAgICAgImNsIiA9IHN1Yl8yJGVuZG9fc2ltcCwKICAgICAgICAgICAgICAgICAgICAgImRwdCIgPSBnZXREUFQoZHB0KSkKCnBsdCA9IGdncGxvdChwbG90X2RmLCBhZXMoeSA9IGNsLCB4ID0gcmFuayhkcHQpLCBmaWxsID0gY2wpKSsKICBnZW9tX2JveHBsb3QoKSsKICB0aGVtZV9idygpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LjUpKQpwcmludChwbHQpCmBgYAoKRmluZCBnZW5lcyB2YXJ5aW5nIGFsb25nIHRoZSBwc2V1ZG90aW1lCgpgYGB7cn0KZGZfZGMgPSBjYmluZChzdWJfMkBtZXRhLmRhdGEsIAogICAgICAgICAgICAgIGRhdGEuZnJhbWUoIkRDMSIgPSBkcHRAZG0kREMxLCAiREMyIiA9IGRwdEBkbSREQzIsIAogICAgICAgICAgICAgICAgICAgICAgICAgIkRQVCIgPSBzY2FsZXM6OnJlc2NhbGUocmFuayhnZXREUFQoZHB0KSksIGMoMC4wMDAwMSwgMC45OTk5OSkpKSkKCiMgd2lsbCBvbmx5IHVzZSB2YXJpYWJsZSBnZW5lcwpodmcgPSBzdWJfMkBhc3NheXMkU0NUQHZhci5mZWF0dXJlcwoKIyBGaXQgR0FNIGZvciBlYWNoIGdlbmUgdXNpbmcgcHNldWRvdGltZSBhcyBpbmRlcGVuZGVudCB2YXJpYWJsZS4KdCA9IGRmX2RjJERQVApnZW5lX2ZpdF9wID0gYygpCmdlbmVfZml0X3ZhbHMgPSBkYXRhLmZyYW1lKHJvdy5uYW1lcyA9IDE6MTAwKQpmb3IoaSBpbiAxOmxlbmd0aChodmcpKXsKICBnID0gaHZnW2ldCiAgeiA9IHN1Yl8yQGFzc2F5cyRTQ1RAZGF0YVtnLF0KICAKICBkID0gZGF0YS5mcmFtZSh6PXosIHQ9dCkKICB0bXAgPSBzdXBwcmVzc01lc3NhZ2VzKGdhbSh6IH4gbnModCwgZGYgPSAzKSwgZGF0YT1kKSkKICAKICAjIGJpbnMgZm9yIG1vZGVsIGZpdHRpbmcKICBiYiA9IHNlcShtaW4odCksIG1heCh0KSwgbGVuZ3RoLm91dCA9IDEwMCkKICBnZW5lX2ZpdF92YWxzWyxnXSA9IHN1cHByZXNzTWVzc2FnZXMocHJlZGljdCh0bXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3ZGF0YSA9IGRhdGEuZnJhbWUodCA9IGJiKSkpCiAgcCA9IHN1bW1hcnkodG1wKSRwYXJhbWV0cmljLmFub3ZhJGBQcig+RilgWzFdCiAgZ2VuZV9maXRfcCA9IGMoZ2VuZV9maXRfcCwgcCkKICBuYW1lcyhnZW5lX2ZpdF9wKVtsZW5ndGgoZ2VuZV9maXRfcCldID0gZwp9CgpnZW5lX2ZpdF9wID0gZmRydG9vbDo6ZmRydG9vbChnZW5lX2ZpdF9wLCBzdGF0aXN0aWM9InB2YWx1ZSIsIHBsb3Q9RiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9RiwgY3V0b2ZmLm1ldGhvZD0icGN0MCIsIHBjdDA9MC45KSRxdmFsCmBgYAoKTm93IHVzZSB0aGUgdG9wIGdlbmVzIHRvIGxlYXJuIHRoZSBwc2V1ZG96b25hdGlvbiBjb29yZGluYXRlcyBhbmQgcHJvamVjdCB0aGUgZW1ib2xpc2VkIGFuZCByZWdlbmVyYXRpbmcgZGF0YQoKYGBge3J9CnNpZ19nZW5lcyA9IGdlbmVfZml0X3BbZ2VuZV9maXRfcDw9MC4wNV0KdG9wX3NpZ19nZW5lcyA9IG5hbWVzKHNpZ19nZW5lc1tvcmRlcihzaWdfZ2VuZXMsIGRlY3JlYXNpbmcgPSBGKV1bMToxMDAwXSkKdG9wX3NpZ19nZW5lcyA9IHRvcF9zaWdfZ2VuZXNbdG9wX3NpZ19nZW5lcyAlaW4lIHJvd25hbWVzKG9ubHlfZW5kX2NlbGxzQGFzc2F5cyRTQ1RAZGF0YSldCgpkYXRhX2dhbV9oID0gY2JpbmQoZGF0YS5mcmFtZSgiRFBUIiA9IGRmX2RjJERQVCksCiAgICAgICAgICAgICAgICAgICBNYXRyaXg6OnQoc3ViXzJAYXNzYXlzJFNDVEBkYXRhW3RvcF9zaWdfZ2VuZXMsXSkpCgpnYW1faGVhbHRoeSA9IGdhbTo6Z2FtKERQVCB+IC4sIGRhdGEgPSBkYXRhX2dhbV9oLCAKICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSBtZ2N2OjpiZXRhcihsaW5rID0gImxvZ2l0IiwgZXBzID0gMC4wMDAwMSkpCgphbGxfcHJlZCA9IHByZWRpY3QoZ2FtX2hlYWx0aHksCiAgICAgICAgICAgICAgICAgICBNYXRyaXg6OnQob25seV9lbmRfY2VsbHNAYXNzYXlzJFNDVEBkYXRhW3RvcF9zaWdfZ2VuZXMsXSksIHR5cGU9ICJyZXNwb25zZSIpCgpnb29kY2wgPSBvbmx5X2VuZF9jZWxscyRwY2EyNV9yZXMuMC45ICVpbiUgc3ViXzIkcGNhMjVfcmVzLjAuOQphbGxfcHJlZF9zdWIgPSBhbGxfcHJlZFtnb29kY2wgJiBvbmx5X2VuZF9jZWxscyRDb25kaXRpb24hPSJoZWFsdGh5IiB8IG5hbWVzKGFsbF9wcmVkKSAlaW4lIGNvbG5hbWVzKHN1Yl8yKV0KCnRyYWpfbGlzdCA9IGxpc3QoImhlYWx0aHkiID0gZGF0YV9nYW1faCREUFQsIAogICAgICAgICAgICAgICAgICJlbWJvbGlzZWQiID0gYWxsX3ByZWRbZ29vZGNsICYgb25seV9lbmRfY2VsbHMkQ29uZGl0aW9uIT0iZW1ib2xpc2VkIl0sIAogICAgICAgICAgICAgICAgICJyZWdlbmVyYXRpbmciID0gYWxsX3ByZWRbZ29vZGNsICYgb25seV9lbmRfY2VsbHMkQ29uZGl0aW9uIT0icmVnZW5lcmF0aW5nIl0pCgpvbmx5X2VuZF9jZWxscyA9IEFkZE1ldGFEYXRhKG9ubHlfZW5kX2NlbGxzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZyYW1lKCJ6b25hdGlvbl9wdCIgPSBhbGxfcHJlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ29vZGNsIiA9IGNvbG5hbWVzKG9ubHlfZW5kX2NlbGxzKSAlaW4lIG5hbWVzKGFsbF9wcmVkX3N1YikpKQpvbmx5X2VuZF9jZWxsc0BtZXRhLmRhdGFbcm93bmFtZXMoZGF0YV9nYW1faCksInpvbmF0aW9uX3B0Il0gPSBkYXRhX2dhbV9oJERQVAoKcGxvdF9kZiA9IG9ubHlfZW5kX2NlbGxzQG1ldGEuZGF0YVtuYW1lcyhhbGxfcHJlZF9zdWIpLF0KcGxvdF9kZiRiaW5zMTAwID0gY3V0KHBsb3RfZGYkem9uYXRpb25fcHQsIDEwKQpwbG90X2RmJENvbmRpdGlvbiA9IGZhY3RvcihwbG90X2RmJENvbmRpdGlvbiwgbGV2ZWxzID0gYygiaGVhbHRoeSIsICJlbWJvbGlzZWQiLCAicmVnZW5lcmF0aW5nIikpCmdncGxvdChwbG90X2RmLCBhZXMoeCA9IGJpbnMxMDAsIGZpbGwgPSBlbmRvX3NpbXApKSsKICAgICBmYWNldF93cmFwKH5Db25kaXRpb24pKwogICAgIGdlb21fYmFyKCkrCiAgICAgbGFicyh4ID0gInpvbmF0aW9uIChiaW5uZWQpIiwgeSA9ICJOdW1iZXIgb2YgY2VsbHMiKSsKICAgICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApKSsKICAgICBjb29yZF9mbGlwKCkrCiAgICAgZ3VpZGVzKGZpbGwgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAidG9wIikpKwogIHRoZW1lX2NsYXNzaWMoKSsKICAgICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBjb2xjb25kKSwKICAgICAgICAgICBsZWdlbmQudGl0bGUuYWxpZ24gPSAwLAogICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQpWbG5QbG90KG9ubHlfZW5kX2NlbGxzWyxuYW1lcyhhbGxfcHJlZF9zdWIpXSwgZmVhdHVyZXMgPSAibkNvdW50X1JOQSIsIAogICAgICAgIGdyb3VwLmJ5ID0gImVuZG9fc2ltcCIsIHNwbGl0LmJ5ID0gIkNvbmRpdGlvbiIpCmdncGxvdChwbG90X2RmLCBhZXMoeCA9IHpvbmF0aW9uX3B0LCB5ID0gZW5kb19zaW1wLCBmaWxsID0gZW5kb19zaW1wKSkrCiAgICAgZmFjZXRfd3JhcCh+Q29uZGl0aW9uKSsKICAgICBnZW9tX3Zpb2xpbigpKwogICAgIGxhYnMoeCA9ICJ6b25hdGlvbiIsIHkgPSAiY2x1c3RlcnMiKSsKICAgICBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApKSsKICAgICBndWlkZXMoZmlsbCA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJ0b3AiKSkrCiAgICAgdGhlbWVfYncoKSsKICAgICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICBsZWdlbmQudGl0bGUuYWxpZ24gPSAwLAogICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQpgYGAKCgoKYGBge3J9CnBsb3RfZGYgPSBvbmx5X2VuZF9jZWxsc0BtZXRhLmRhdGEKcGxvdF9kZiRwdCA9IGFsbF9wcmVkW2NvbG5hbWVzKG9ubHlfZW5kX2NlbGxzKV0KcGxvdF9kZiRiaW5zMTAwID0gY3V0KHBsb3RfZGYkcHQsIDEwKQpwbG90X2RmJENvbmRpdGlvbiA9IGZhY3RvcihwbG90X2RmJENvbmRpdGlvbiwgbGV2ZWxzID0gYygiaGVhbHRoeSIsICJlbWJvbGlzZWQiLCAicmVnZW5lcmF0aW5nIikpCgpnZ3Bsb3QocGxvdF9kZiwgYWVzKHggPSBwdCwgeSA9IGVuZG9fc2ltcCwgZmlsbCA9IGVuZG9fc2ltcCkpKwogICAgIGZhY2V0X3dyYXAofkNvbmRpdGlvbikrCiAgICAgZ2VvbV92aW9saW4oKSsKICAgICBsYWJzKHggPSAiem9uYXRpb24iLCB5ID0gImNsdXN0ZXJzIikrCiAgICAgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSkrCiAgICAgZ3VpZGVzKGZpbGwgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAidG9wIiwgcmV2ZXJzZSA9IFQpKSsKICAgICB0aGVtZV9idygpKwogICAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgIGxlZ2VuZC50aXRsZS5hbGlnbiA9IDAsCiAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikKYGBgCgpEbyBjcm9zcyB2YWxpZGF0aW9uIG9uIHRoZSBoZWFsdGh5IHRyYWplY3RvcnkKCmBgYHtyfQpzaWdfZ2VuZXMgPSBnZW5lX2ZpdF9wW2dlbmVfZml0X3A8PTAuMDVdCnRvcF9zaWdfZ2VuZXMgPSBuYW1lcyhzaWdfZ2VuZXNbb3JkZXIoc2lnX2dlbmVzLCBkZWNyZWFzaW5nID0gRildWzE6MTAwMF0pIAoKZGF0YV9nYW1faCA9IGNiaW5kKGRhdGEuZnJhbWUoIkRQVCIgPSB0cmFqX2xpc3QkaGVhbHRoeSksCiAgICAgICAgICAgICAgICAgICBNYXRyaXg6OnQoc3ViXzJAYXNzYXlzJFNDVEBkYXRhW3RvcF9zaWdfZ2VuZXMsXSkpCmNvbG5hbWVzKGRhdGFfZ2FtX2gpID0gZ3N1YigiLSIsICJfIiwgY29sbmFtZXMoZGF0YV9nYW1faCksIGZpeGVkID0gVCkKY29sbmFtZXMoZGF0YV9nYW1faCkgPSBnc3ViKCIuIiwgIl8iLCBjb2xuYW1lcyhkYXRhX2dhbV9oKSwgZml4ZWQgPSBUKQoKY3ZfZ2FtID0gQ1ZnYW0oZGF0YSA9IGRhdGFfZ2FtX2gsIGZvcm11bGEgPSBEUFQgfiAuLCBuZm9sZCA9IDEwLCBzZWVkID0gMSwgbWV0aG9kID0gImdsbS5maXQiKQoKcGRmKCJyZXN1bHRzL2VuZG90aGVsaWFsL2VuZF9vcmlnaW5hbF9maXR0ZWRfcHNldWRvdGltZS5wZGYiLCB1c2VEaW5nYmF0cyA9IEYsIAogICAgd2lkdGggPSA2LCBoZWlnaHQgPSA1KQpwbG90KGRhdGFfZ2FtX2gkRFBULCBjdl9nYW0kZml0dGVkLCB4bGFiID0gIkhlYWx0aHkgcHNldWRvdGltZSIseWxhYiA9ICJQcmVkaWN0ZWQgSGVhbHRoeSIsCiAgICAgbWFpbiA9IHBhc3RlMCgiSGVhbHRoeSBvcmlnaW5hbCB2cyBmaXR0ZWQgcHNldWRvdGltZVxuTVNFOiAiLCByb3VuZChjdl9nYW0kY3ZzY2FsZSwgNikpLAogICAgIHBjaCA9IDE5LCBjZXggPSAwLjUpCmFibGluZSgwLDEsIGNvbCA9ICJibHVlIiwgbHdkID0gMykKZGV2Lm9mZigpCgpwbG90X2RmID0gZGF0YS5mcmFtZSgib3JpZ2luYWwiID0gZGF0YV9nYW1faCREUFQsICJwcmVkaWN0ZWQiID0gY3ZfZ2FtJGZpdHRlZCkKcGxvdF9kZiRjbCA9IHN1Yl8yQG1ldGEuZGF0YSRlbmRvX3NpbXAKZ2dwbG90KHBsb3RfZGYsIGFlcyh4ID0gb3JpZ2luYWwsIHkgPSBwcmVkaWN0ZWQsIGNvbG91ciA9IGNsKSkrZ2VvbV9wb2ludCgpCmBgYAoKRmluZCB2YXJ5aW5nIGdlbmVzIC0gdXNpbmcgYWxsIGNlbGxzIGFsb25nIHRoZSByYW5rZWQgcHNldWRvdGltZQoKYGBge3J9CiMjIGdldCB2YXJ5aW5nIGdlbmVzIGZvciBlYWNoIGNvbmRpdGlvbgpudW1Db3JlcyA9IDEyICNsYXJnZXIgdmFsdWVzIHJlc3VsdGVkIGluIHByb2JsZW1zCnN0YXJ0X3RpbWUgPC0gU3lzLnRpbWUoKQpjb25kX2ZpdF9saXN0ID0gbGlzdCgpCgpvbmx5X2VuZF9jZWxsc19iZiA9IG9ubHlfZW5kX2NlbGxzWyxvbmx5X2VuZF9jZWxscyRwY2EyNV9yZXMuMC45ICVpbiUgc3ViXzIkcGNhMjVfcmVzLjAuOV0Kb25seV9lbmRfY2VsbHNfc3BsaXQgPSBTcGxpdE9iamVjdChvbmx5X2VuZF9jZWxsc19iZiwgc3BsaXQuYnkgPSAiQ29uZGl0aW9uIikKCmZvcihjb25kIGluIG5hbWVzKG9ubHlfZW5kX2NlbGxzX3NwbGl0KSl7CiAgcHJpbnQoY29uZCkKICAKICBzdWJfZGF0ID0gb25seV9lbmRfY2VsbHNfc3BsaXRbW2NvbmRdXQogICMgRml0IEdBTSBmb3IgZWFjaCBnZW5lIHVzaW5nIHBzZXVkb3RpbWUgYXMgaW5kZXBlbmRlbnQgdmFyaWFibGUuCiAgY29uZF9maXRfbGlzdFtbY29uZF1dID0gbWNsYXBwbHkoaHZnLCBmaXR0aW5nRnVuYywgbWMuY29yZXMgPSBudW1Db3JlcykKfQplbmRfZml0c19xdmFsID0gbGlzdCgpCmZvcihjb25kIGluIG5hbWVzKGNvbmRfZml0X2xpc3QpKXsKICBmaXRzX2RmID0gUmVkdWNlKGNiaW5kLCBsYXBwbHkoY29uZF9maXRfbGlzdFtbY29uZF1dLCBmdW5jdGlvbih4KSB4JGZpdHMpKQogIAogIHB2YWxfbGlzdCA9IHVubGlzdChsYXBwbHkoY29uZF9maXRfbGlzdFtbY29uZF1dLCBmdW5jdGlvbih4KSB4JHB2YWwpKQogIG5hbWVzKHB2YWxfbGlzdCkgPSBodmcKICAKICBwdmFsX2RmID0gZGF0YS5mcmFtZShwdmFsX2xpc3QpCiAgCiAgZW5kX2ZpdHNfcXZhbFtbY29uZF1dID0gbGlzdCgiZml0cyIgPSBmaXRzX2RmLCAicHZhbCIgPSBwdmFsX2RmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZkciIgPSBhcHBseShwdmFsX2RmLCAyLCBmdW5jdGlvbih4KSBwLmFkanVzdCh4LCBtZXRob2QgPSAiZmRyIikpKQp9CmVuZF90aW1lIDwtIFN5cy50aW1lKCkKZW5kX3RpbWUgLSBzdGFydF90aW1lCgpzYXZlUkRTKGVuZF9maXRzX3F2YWwsIGZpbGUgPSAicmVzdWx0cy9lbmRvdGhlbGlhbC9lbmRfZml0c19xdmFsLlJEUyIpCmBgYAoKQ29ycmVsYXRlIGdlbmVzIGJldHdlZW4gY29uZGl0aW9ucwoKYGBge3J9CmcgPSAiTFlWRTEiCnBsb3QoZW5kX2ZpdHNfcXZhbCRoZWFsdGh5JGZpdHNbLGddKQpwb2ludHMoZW5kX2ZpdHNfcXZhbCRlbWJvbGlzZWQkZml0c1ssZ10sIGNvbCA9ICJyZWQiKQpwb2ludHMoZW5kX2ZpdHNfcXZhbCRyZWdlbmVyYXRpbmckZml0c1ssZ10sIGNvbCA9ICJibHVlIikKCmFsbF92YXJfZ2VuZXMgPSAoZW5kX2ZpdHNfcXZhbCRoZWFsdGh5JGZkcjw9MC4wNSAmIAogIGFwcGx5KGVuZF9maXRzX3F2YWwkaGVhbHRoeSRmaXRzLCAyLCBmdW5jdGlvbih4KSBkaWZmKHJhbmdlKHgpKT49MC4wNSkpIHwgCiAgKGVuZF9maXRzX3F2YWwkZW1ib2xpc2VkJGZkcjw9MC4wNSAmIAogIGFwcGx5KGVuZF9maXRzX3F2YWwkZW1ib2xpc2VkJGZpdHMsIDIsIGZ1bmN0aW9uKHgpIGRpZmYocmFuZ2UoeCkpPj0wLjA1KSkgfCAKICAoZW5kX2ZpdHNfcXZhbCRyZWdlbmVyYXRpbmckZmRyPD0wLjA1ICYgCiAgYXBwbHkoZW5kX2ZpdHNfcXZhbCRyZWdlbmVyYXRpbmckZml0cywgMiwgZnVuY3Rpb24oeCkgZGlmZihyYW5nZSh4KSk+PTAuMDUpKQoKZW5kX2Nvcl9oZSA9IHNhcHBseShyb3duYW1lcyhhbGxfdmFyX2dlbmVzKVthbGxfdmFyX2dlbmVzXSwgCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oZykgY29yKGVuZF9maXRzX3F2YWwkaGVhbHRoeSRmaXRzWyxnXSxlbmRfZml0c19xdmFsJGVtYm9saXNlZCRmaXRzWyxnXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJzcCIpLCBzaW1wbGlmeSA9IFQpCmVuZF9jb3JfaHIgPSBzYXBwbHkocm93bmFtZXMoYWxsX3Zhcl9nZW5lcylbYWxsX3Zhcl9nZW5lc10sIAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGcpIGNvcihlbmRfZml0c19xdmFsJGhlYWx0aHkkZml0c1ssZ10sZW5kX2ZpdHNfcXZhbCRyZWdlbmVyYXRpbmckZml0c1ssZ10sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAic3AiKSwgc2ltcGxpZnkgPSBUKQplbmRfY29yX2VyID0gc2FwcGx5KHJvd25hbWVzKGFsbF92YXJfZ2VuZXMpW2FsbF92YXJfZ2VuZXNdLCAKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihnKSBjb3IoZW5kX2ZpdHNfcXZhbCRlbWJvbGlzZWQkZml0c1ssZ10sZW5kX2ZpdHNfcXZhbCRyZWdlbmVyYXRpbmckZml0c1ssZ10sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAic3AiKSwgc2ltcGxpZnkgPSBUKQoKY29yX2dfZGYgPSBkYXRhLmZyYW1lKCJnZW5lIiA9IG5hbWVzKGVuZF9jb3JfaGUpLCAKICAgICAgICAgICAgICAgICAgICAgICJIdkUiID0gZW5kX2Nvcl9oZSwgIkh2UiIgPSBlbmRfY29yX2hyLCAiRXZSIiA9IGVuZF9jb3JfZXIpCndyaXRlLmNzdihjb3JfZ19kZiwgZmlsZSA9ICJyZXN1bHRzL2VuZG90aGVsaWFsL2NvcnJlbGF0aW9uc196b25hdGlvbl9lbmRvdGhlbGlhbC5jc3YiLCAKICAgICAgICAgIHJvdy5uYW1lcyA9IFQsIHF1b3RlID0gRikKYGBgCgpHTyBUZXJtIGVucmljaG1lbnQKCmBgYHtyfQpnb3RfY29yID0gbGlzdCgpCmVnX2FsbCA9IGNsdXN0ZXJQcm9maWxlcjo6Yml0cihjb2xuYW1lcyhlbmRfZml0c19xdmFsJGhlYWx0aHkkZml0cyksIGZyb21UeXBlPSJTWU1CT0wiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1R5cGU9IkVOVFJFWklEIiwgT3JnRGI9Im9yZy5Icy5lZy5kYiIpCgplZyA9IGNsdXN0ZXJQcm9maWxlcjo6Yml0cihuYW1lcyhlbmRfY29yX2hlKVtlbmRfY29yX2hlPDAuM10sIGZyb21UeXBlPSJTWU1CT0wiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9UeXBlPSJFTlRSRVpJRCIsIE9yZ0RiPSJvcmcuSHMuZWcuZGIiKQpnb3QgPSBjbHVzdGVyUHJvZmlsZXI6OmVucmljaEdPKGdlbmUgPSBlZyRFTlRSRVpJRCwgdW5pdmVyc2UgPSBlZ19hbGwkRU5UUkVaSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9yZ0RiID0gb3JnLkhzLmVnLmRiLCBvbnQgPSAiQlAiLCBwdmFsdWVDdXRvZmYgID0gMC4wMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdmFsdWVDdXRvZmYgID0gMC4wNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkanVzdE1ldGhvZCA9ICJCSCIsIHJlYWRhYmxlID0gVCkKZ290X2NvcltbIm5vdGNvcl9oZSJdXSA9IGdldFRvcFRlcm1zKGdvdEByZXN1bHRbZ290QHJlc3VsdCRwLmFkanVzdDw9MC4wNSxdLCBuY2wgPSA0LCBudCA9IDIsIHRvcHQgPSAxMDAwKQoKZWcgPSBjbHVzdGVyUHJvZmlsZXI6OmJpdHIobmFtZXMoZW5kX2Nvcl9oZSlbZW5kX2Nvcl9oZT49MC4zXSwgZnJvbVR5cGU9IlNZTUJPTCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICB0b1R5cGU9IkVOVFJFWklEIiwgT3JnRGI9Im9yZy5Icy5lZy5kYiIpCmdvdCA9IGNsdXN0ZXJQcm9maWxlcjo6ZW5yaWNoR08oZ2VuZSA9IGVnJEVOVFJFWklELCB1bml2ZXJzZSA9IGVnX2FsbCRFTlRSRVpJRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3JnRGIgPSBvcmcuSHMuZWcuZGIsIG9udCA9ICJCUCIsIHB2YWx1ZUN1dG9mZiAgPSAwLjAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF2YWx1ZUN1dG9mZiAgPSAwLjA1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRqdXN0TWV0aG9kID0gIkJIIiwgcmVhZGFibGUgPSBUKQpnb3RfY29yW1siY29yX2hlIl1dID0gZ2V0VG9wVGVybXMoZ290QHJlc3VsdFtnb3RAcmVzdWx0JHAuYWRqdXN0PD0wLjA1LF0sIG5jbCA9IDQsIG50ID0gMiwgdG9wdCA9IDEwMDApCgplZyA9IGNsdXN0ZXJQcm9maWxlcjo6Yml0cihuYW1lcyhlbmRfY29yX2hyKVtlbmRfY29yX2hyPDAuM10sIGZyb21UeXBlPSJTWU1CT0wiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9UeXBlPSJFTlRSRVpJRCIsIE9yZ0RiPSJvcmcuSHMuZWcuZGIiKQpnb3QgPSBjbHVzdGVyUHJvZmlsZXI6OmVucmljaEdPKGdlbmUgPSBlZyRFTlRSRVpJRCwgdW5pdmVyc2UgPSBlZ19hbGwkRU5UUkVaSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9yZ0RiID0gb3JnLkhzLmVnLmRiLCBvbnQgPSAiQlAiLCBwdmFsdWVDdXRvZmYgID0gMC4wMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdmFsdWVDdXRvZmYgID0gMC4wNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkanVzdE1ldGhvZCA9ICJCSCIsIHJlYWRhYmxlID0gVCkKZ290X2NvcltbIm5vdGNvcl9ociJdXSA9IGdldFRvcFRlcm1zKGdvdEByZXN1bHRbZ290QHJlc3VsdCRwLmFkanVzdDw9MC4wNSxdLCBuY2wgPSA0LCBudCA9IDIsIHRvcHQgPSAxMDAwKQoKZWcgPSBjbHVzdGVyUHJvZmlsZXI6OmJpdHIobmFtZXMoZW5kX2Nvcl9ocilbZW5kX2Nvcl9ocj49MC4zXSwgZnJvbVR5cGU9IlNZTUJPTCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICB0b1R5cGU9IkVOVFJFWklEIiwgT3JnRGI9Im9yZy5Icy5lZy5kYiIpCmdvdCA9IGNsdXN0ZXJQcm9maWxlcjo6ZW5yaWNoR08oZ2VuZSA9IGVnJEVOVFJFWklELCB1bml2ZXJzZSA9IGVnX2FsbCRFTlRSRVpJRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3JnRGIgPSBvcmcuSHMuZWcuZGIsIG9udCA9ICJCUCIsIHB2YWx1ZUN1dG9mZiAgPSAwLjAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF2YWx1ZUN1dG9mZiAgPSAwLjA1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRqdXN0TWV0aG9kID0gIkJIIiwgcmVhZGFibGUgPSBUKQpnb3RfY29yW1siY29yX2hyIl1dID0gZ2V0VG9wVGVybXMoZ290QHJlc3VsdFtnb3RAcmVzdWx0JHAuYWRqdXN0PD0wLjA1LF0sIG5jbCA9IDQsIG50ID0gMiwgdG9wdCA9IDEwMDApCgpzYXZlUkRTKGdvdF9jb3IsIGZpbGUgPSAicmVzdWx0cy9lbmRvdGhlbGlhbC9HT1Rlcm1zX2NvcnJlbGF0aW9ucy5SRFMiKQpgYGAKClBsb3QgdG9wIGdlbmVzIGluIGNvcnJlbGF0aW9uCgpgYGB7cn0KdG9wZ2VuZXMgPSB1bmlxdWUoYyhuYW1lcyhlbmRfY29yX2hlW29yZGVyKGVuZF9jb3JfaGUsIGRlY3JlYXNpbmcgPSBUKV0pWzE6MzBdLAogICAgICAgICAgICAgbmFtZXMoZW5kX2Nvcl9ocltvcmRlcihlbmRfY29yX2hyLCBkZWNyZWFzaW5nID0gVCldKVsxOjMwXSkpCmJvdHRvbWdlbmVzID0gdW5pcXVlKGMobmFtZXMoZW5kX2Nvcl9oZVtvcmRlcihlbmRfY29yX2hlLCBkZWNyZWFzaW5nID0gRildKVsxOjMwXSwKICAgICAgICAgICAgIG5hbWVzKGVuZF9jb3JfaHJbb3JkZXIoZW5kX2Nvcl9ociwgZGVjcmVhc2luZyA9IEYpXSlbMTozMF0pKQp1c2VnZW5lcyA9IGModG9wZ2VuZXMsIGJvdHRvbWdlbmVzKQoKYmluc19saXN0ID0gbGlzdCgpCmZvcihuIGluIG5hbWVzKG9ubHlfZW5kX2NlbGxzX3NwbGl0KSl7CiAgcGxvdF9kZiA9IGNiaW5kKGRhdGEuZnJhbWUoInB0IiA9IHJlcCgxOjEwLCBlYWNoID0gMTApKSxlbmRfZml0c19xdmFsW1tuXV0kZml0c1ssdXNlZ2VuZXNdKQogIHBsb3RfZGYkYmluczEwID0gY3V0KHBsb3RfZGYkcHQsIDEwKQogIGJpbnNfbGlzdFtbbl1dID0gc2FwcGx5KHVzZWdlbmVzLCBmdW5jdGlvbih4KSBzY2FsZSh0YXBwbHkocGxvdF9kZlsseF0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdF9kZiRiaW5zMTAsIG1lYW4pKVsxMDoxXSkKfQpiaW5zX21lYW4gPSBSZWR1Y2UocmJpbmQsIGJpbnNfbGlzdCkKCmhjdCA9IGhjbHVzdChkaXN0KHQoYmluc19saXN0JGhlYWx0aHlbLHRvcGdlbmVzXSkpLCBtZXRob2QgPSAid2FyZC5EMiIpCm9yZF9ib3RfaCA9IGFwcGx5KGJpbnNfbGlzdCRoZWFsdGh5Wyxib3R0b21nZW5lc10sIDIsIHdoaWNoLm1heCkKb3JkX2JvdF9lID0gYXBwbHkoYmluc19saXN0JGVtYm9saXNlZFssYm90dG9tZ2VuZXNdLCAyLCB3aGljaC5tYXgpCm9yZF9ib3RfciA9IGFwcGx5KGJpbnNfbGlzdCRyZWdlbmVyYXRpbmdbLGJvdHRvbWdlbmVzXSwgMiwgd2hpY2gubWF4KQpvcmRfZGYgPSBkYXRhLmZyYW1lKG9yZF9ib3RfaCwgb3JkX2JvdF9lLCBvcmRfYm90X3IpCm9yZF9ib3QgPSByb3duYW1lcyhvcmRfZGYpW3dpdGgob3JkX2RmLCBvcmRlcihvcmRfYm90X2gsIG9yZF9ib3RfZSwgb3JkX2JvdF9yLCBkZWNyZWFzaW5nID0gVCkpXQpvcmQgPSBjKHRvcGdlbmVzW2hjdCRvcmRlcl0sIG9yZF9ib3QpCgpwaGVhdG1hcDo6cGhlYXRtYXAoYmluc19tZWFuWyxvcmRdLCBzaG93X3Jvd25hbWVzID0gRiwgZm9udHNpemVfY29sID0gNi41LCBib3JkZXJfY29sb3IgPSBOQSwKICAgICAgICAgICAgICAgICAgIGdhcHNfcm93ID0gYygxMCwyMCksIGdhcHNfY29sID0gYyhsZW5ndGgodG9wZ2VuZXMpKSwKICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJpbmdfbWV0aG9kID0gIndhcmQuRDIiLCBjbHVzdGVyX3Jvd3MgPSBGLCBjbHVzdGVyX2NvbHMgPSBGKQpgYGAKClNhdmUgU2V1cmF0IHdpdGggcHJlZGljdGlvbnMKCmBgYHtyfQpzYXZlUkRTKG9ubHlfZW5kX2NlbGxzLCBmaWxlID0gInJlc3VsdHMvZW5kb3RoZWxpYWwvb25seV9lbmRfY2VsbHNfem9uLlJEUyIpCmBgYAoKCgoKCgoKCgoKCg==